CF1300C-Anu Has a Function 思维
那个函数的功能f(x,y)就是把y有1的位置,对应的x位置也都变成0。所以我们发现只有第一个数不同会带来结果变化,后面怎么排序没关系。
我们考虑那个数当第一个数最后结果最大。我们记录下二进制下每一位,出现过多少个1。然后依次枚举每个数当第一个数,然后把这个数1的位置对应出现1次数减去1,如果变0了,就证明这个数放在开头,答案二进制这一位是1,然后取最大就好了。
1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 int a[210000],uni[30],cnt[30],n,maxn; 5 int main() 6 { 7 uni[0] = 1; 8 for (int i = 1;i <= 30;i++) 9 uni[i] = uni[i - 1] << 1; 10 scanf("%d",&n); 11 for (int i = 1;i <= n;i++) 12 { 13 scanf("%d",&a[i]); 14 for (int o = 0;o <= 30;o++) 15 if (a[i] & uni[o]) 16 cnt[o]++; 17 } 18 maxn = 0; 19 for (int i = 1;i <= n;i++) 20 { 21 int tmp = 0; 22 for (int o = 0;o <= 30;o++) 23 if ((a[i] & uni[o]) && cnt[o] == 1) 24 tmp += uni[o]; 25 if (tmp >= maxn) 26 { 27 maxn = tmp; 28 swap(a[1],a[i]); 29 } 30 } 31 printf("%d",a[1]); 32 for (int i = 2;i <= n;i++) 33 printf(" %d",a[i]); 34 printf("\n"); 35 return 0; 36 }
心之所动 且就随缘去吧