题解: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;
}
点个 (欲言又止)