题解:P9256 [PA 2022] Muzyka pop 2

题解:P9256 [PA 2022] Muzyka pop 2

题目传送门

题目重点

从前往后比较,和数字比较一样,如:12345 < 12445 。
如果一个串是另一个串的前缀,那么不是前缀串的那个字典序小。

题目思路

我爱贪心

贪心就行了,每次让 x 增加 1 ,找出 1 的个数来实现。要求序列是字典序最小的,因此每次选择尽可能小的数字 x 。

记得 vector 有一个什么 popcount 的函数,上网搜了一下,发现了 __builtin_popcount 可以输出二进制中 true 的个数,就用了 vector。

代码不重要,主要是思路。

#include <bits/stdc++.h>
using namespace std;
vector<int> v;
int n, s, x;
int main(){
    cin >> n;
    while(s < n) s += __builtin_popcount(++x);
    for(int i = x; i >= 1; i--){
        if(s - __builtin_popcount(i) >= n) s -= __builtin_popcount(i);
        else v.emplace_back(i);
    }
    cout << v.size() << "\n";
    for(int i = 0; i < v.size(); i++) cout << v[i] << " ";
    return 0;
}

点个 (欲言又止)

posted @ 2024-08-26 20:39  wayneoi  阅读(0)  评论(0编辑  收藏  举报