题意:让你构造一个序列,使得序列异或和最大,序列为n 的全排列 ,序列和计算方式为 SUM = a[1] ^ 0 + a[2] ^ 1 + a[3] ^ 2 + .......a[n] ^ n
感想 :之前没做过有关位运算的题,对这一块很陌生,两个数异或以后,如果二进制每一位都为1,那么一定最大,找规律发现当n为偶数时 除开0以外,其他的都是成对出现
当n为奇数时 都是成对出现 例如n=4, 0 1 2 3 4 分别对应0 2 1 4 3 ;n=5时 0 1 2 3 4 5 分别对应1 0 5 4 3 2 自己可以在草稿纸上模拟下;
ac代码:
#include<iostream>
#include<cstring>
#include<cstdio>
typedef __int64 ll;
using namespace std;
ll result[1000010];
ll n;
int main()
{
while(scanf("%I64d",&n)!=EOF)
{
ll k=1;
while(k<=n)
k*=2;
k--;
memset(result,-1,sizeof(result));
for(int i=n;i>=0;i--)//反着找 不用分奇数和偶数讨论
{
if(result[i]!=-1)//已经匹配了 继续下一个数
continue;
else
{
while((k^i)>n||result[k^i]!=-1)
k/=2;
result[k^i]=i;
result[i]=k^i;//例如上面第二个例子中 result[2]=5;result[5]=2;
}
}//注 w^q^q=w;上面的k即为下面j^result[j]的结果
ll sum=0;
for(int j=0;j<=n;j++)
sum+=j^result[j];
printf("%I64d\n",sum);
for(int q=0;q<n;q++)
printf("%I64d ",result[q]);
printf("%I64d\n",result[n]);
}
return 0;
}
//不好的话直接提出来 ,本人水平太低了 望大家指教