LightOJ 1042 Secret Origins(二进制、STL)

来源:互联网 发布:cuda 8.0 linux下载 编辑:程序博客网 时间:2024/05/16 05:36

将一个数字化为二进制,并算出这个二进制数所含‘1’的个数,求出最小的比这个数大的并含相同‘1’个数的数。

先将二进制数转化成 string,再用next_permutation() 即可。不过还有一种情况,就是这个二进制数已经是最后一个排列了,这时候就要给原二进制加上一位数了,具体做法体现在代码中。

#include<iostream>#include<algorithm>#include<string>using namespace std;__int64 cvt(string a){__int64 result = 1;for(int i = 1; i < a.size(); i++){if(a[i] == '0')result = (result << 1);elseresult = (result << 1 | 1);}return result;}int main(){int N, caseNo = 0;cin >> N;while(N--){__int64 T, onoroy = 0;string strT = "";cin >> T;while(T){if(T % 2 == 1){onoroy++;strT.insert(0, "1");}else{strT.insert(0, "0");}T /= 2;}if(!next_permutation(strT.begin(), strT.end())){strT.insert(0, "10");strT.erase(strT.size() - 1, 1);}cout << "Case " << ++ caseNo << ": " << cvt(strT) << endl;}}

原创粉丝点击