牛客小白月赛78-C第K小表示数

发布时间 2023-09-15 22:40:08作者: wzihan

题意

给定k和一个集合初始只包含a,b,每次可以选择一个数乘2或者选择两个数相加然后将结果放入集合中,问所有可能的集合中第k小值最小值。

思路

从小到大贪心,每次将该值加a和加b,当集合的大小枚举到2k时说明指针已经枚举到第k个。

代码

#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#define debug(x) cerr << #x << ' ' << x << '\n' 
using namespace std; 
typedef pair<int, int> PII;

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    int k, a, b;
    cin >> k >> a >> b;

    set<int> s{a, b};
    for (auto it = s.begin(); s.size() < 2 * k; it = next(it)) {
        s.insert(*it + a);
        s.insert(*it + b);
    }

    auto it = s.begin();
    for (int i = 1; i < k; i++) it = next(it);
    cout << *it;

    return 0;
}