C
题目:
定义数为321这个数的每一个数位都比右边的数位大,输出第k小得321数
可以知道,最大得321数是9876543210,9位数,所以我们需要预处理出小于10位数的数,所以可以考虑二进制枚举
eg:
i: 0111001000 (十进制是456)
9876543210
087 6003000
x: 8763
#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
vector<int>v;
for(int i = 2; i < (1 << 10); i ++) /*这一步其实是在枚举二进制数,因为二进制数都是
由0和1组成的,1<<10表示左移,现在只看这个二进制数,相当于是九位的二进制数,*/
{
int x = 0;
for(int j = 9; j >= 0; j --)//9876543210是最大的321数,然后一一对应上面的i,二进制数
{
if(i >> j & 1) // i>>j表示i的第j位,如果是1,那就是这一位被选上了
x = x * 10 + j;
}
v.push_back(x);
}
sort(v.begin(), v.end());
int k; cin >> k;
cout << v[k - 1] << endl;
return 0;
}