首页 > 代码库 > hdu 5014 Number Sequence

hdu 5014 Number Sequence

为了a异或b的和最大,只需另b在不大于n的情况下按位取反即可。

这里有两个输出小技巧可以参考:

1.在用printf输出__int64时,在windows下使用格式"%I64d",在linux下使用"%lld",在hdu中应使用"%I64d",如果拿不准就是用cout好了。

2.在遇到每个数之间有空格,最后一个数后面是换行时可以使用这个小技巧:

for (int i = 0; i < n; i++ ) printf("%d%c", a[i], (i == n-1? \n :  ));

完整代码如下:

 1 #define MAXN 100005 2 #include <stdlib.h> 3 #include <iostream> 4 #include <stdio.h> 5 using namespace std; 6 int arr[MAXN]; 7 int ans[MAXN]; 8 bool vis[MAXN]; 9 int n;10 void solve()11 {12     for( int i = n-1 ; i >= 0 ; i-- )13     {14         if( vis[i] == 0 )15         {16             int bit = 1;17             while(bit <= i)18             {19                 bit <<= 1;20             }21             ans[bit-1-i] = i;22             ans[i] = bit - 1 - i;23             vis[i] = vis[bit-1-i] = 1;24         }25     }26     printf("%I64d\n", 1ll * n * (n-1));27     //cout<<1ll * n *(n-1)<<endl;28     for( int i = 0 ; i < n ; i++ )29     {30         printf("%d%c",ans[arr[i]], (i == n-1? \n :  ));31     }32     fill(vis, vis+MAXN, 0);33 }34 int main(int argc, char *argv[])35 {36     while(scanf("%d", &n) != EOF)37     {38         n++;39         for( int i = 0 ; i < n ; i++ )40         {41             scanf("%d", &arr[i]);42         }43         solve();44     }45 }

 

hdu 5014 Number Sequence