题目地址:http://codeforces.com/problemset/problem/288/C
思路:保证位数尽量大的情况下使得每二进制位均为一的情况下结果最大,从后向前枚举(保证位数尽量大),num表示该数i二进制有几位,x即为使得与i异或后每二进制位均为一的数,v[x]标记是否使用过该数,若未使用则与i搭配。
#include<cstdio> #include<cmath> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n; long long sum=0; int v[1000050]; int ans[1000050]; int main() { scanf("%d",&n); for(int i=n;i>0;i--) { if(!v[i]) { int num=(int)(log2(i))+1; int x=((1<<num)-1)^i; v[x]=1,ans[i]=x,ans[x]=i; sum+=(((1<<num)-1)<<1); } } printf("%I64d\n",sum); for(int i=0;i<n;i++) printf("%d ",ans[i]); printf("%d\n",ans[n]); return 0; }
Codeforces Round #177 (Div. 1) C. Polo the Penguin and XOR operation(贪心)
原文:http://blog.csdn.net/wang2147483647/article/details/52048690