看了题解真的感觉还挺简单的,但考试的时候没有注意到所有的数都是由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; }