看了题解真的感觉还挺简单的,但考试的时候没有注意到所有的数都是由a*x+b*y构成的。而且题也没有读明白,以为一开始不止两个数呢。
本质上是一道数学题吧,感觉不算什么算法硬要说的话算贪心吧。
可以看到所有的数都是由a和b的倍数和相加得到,那么我们想得到最小的第k个数,就需要每一步得到一个最小的值。而如何去计算出最小的值呢,那么可以掏出当前的最小的值(也就是set容器的第一个,因为set容器内部默认从大到小排序)。那么这个最小值要么加上a要么加上b可以得到最小的,可能你会想要是b超级大那么加b得到的不就不是小的值了吗?确实是这样,但并不影响结果,因为我们加上a就是下一个最小值,所以就算加上b大了也不需要去管他,我们只是要去第k个。还有就是题目中说重复的算一个,那么我们计算一个最小值加a加b的下一个后就得把这个最小值踢出去,以防止出现死循环。
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;


int main() {
    ll k, a, b, l;
    cin>>k>>a>>b;
    set<ll> s;
    s.insert(a);
    s.insert(b);
    while (k--) {
        l = *s.begin();
        s.erase(s.begin());
        s.insert(l+a);
        s.insert(l+b);
    }
    cout<<(l);
    return 0;
}