链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
“O.o?”
集合中一开始拥有两个数字 a和b,如果 a与 b 相同,那么仅有一个数字。
小沙每次可以选择集合中的两个数(可以相同),将他们的和放入集合中,请问所有可能的集合中,第 K 小的值最小为多少?
注:集合中相同元素只能有一个。
刚刚看这题的时候,就有这样的思路,任何一个集合里面的数都可以用i*a+j*b表示,然后想着用循环遍历,然后用优先队列储存,但是发现有个问题,相同数不能筛掉,所以自然想到了set,然而只想到了去重,后面看大佬的思路,发现每次把元素放集合里是把set集合最小一位加a或者b,用set储存。
- #include
- using ll=long long;
- using namespace std;
- const ll mod=1e9+7;
- void solve()
- {
- set
q; - ll k,a,b;
- cin>>k>>a>>b;
- q.insert(a),q.insert(b);
- ll res;
- while(k--)
- {
- res=*q.begin();
- q.erase(res);
- q.insert(a+res);
- q.insert(b+res);
- }
- cout<
'\n'; - }
- int main()
- {
- ios_base::sync_with_stdio(false);
- cin.tie(0);
- cout.tie(0);
- ll t=1;
- while(t--)
- solve();
- return 0;
- }