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