牛客月赛c(简单推理,以及对set的灵活运用)

链接:登录—专业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<

你可能感兴趣的:(c语言,开发语言)