题意:
就是让你构造一个序列,使得序列异或和最大,序列为n 的全排列 ,序列和计算方式为 SUM = a[1] ^ 0 + a[2] ^ 1 + a[3] ^ 2 + .......a[n] ^ n
构造出一个序列使得和最大
题解:
策略为使得每次异或出来的结果的1尽可能多,而优先从最大的n 开始考虑,因为n 最有可能出更大的数字
代码:
#include<stdio.h> #include<string.h> int Ans[1000005]; int main() { int n, x; while(scanf("%d", &n) != EOF) { x = 1; while(x <= n) x = x<<1; x --; memset(Ans, 255, sizeof(Ans)); for(int i = n; i>= 0; i--) { if(Ans[i] != -1) continue; // printf("%d\n", x); while((x^i) > n || Ans[x^i] != -1) x = x>>1; // printf("%d %d\n", i, x); Ans[x^i] = i, Ans[i] = x^i; } __int64 sum = 0; for(int i = 0; i <= n; i++) { sum += (i^Ans[i]); } printf("%I64d\n%d", sum, Ans[0]); for(int i = 1; i <= n; i++) printf(" %d", Ans[i]); printf("\n"); } }
时间: 2024-10-14 01:14:03