首先,第一行献给我痛苦的两个小时调试
题意:排序数组,使得
f
(
f
(
…
f
(
f
(
a
1
,
a
2
)
,
a
3
)
,
…
a
n
−
1
)
,
a
n
)
f(f(…f(f(a1,a2),a3),…an−1),an)
f(f(…f(f(a1,a2),a3),…an−1),an)的值最大
很显然这是一道位运算类模板题
套路:
自定而下枚举数位,然后枚举数组中的每个数
思路:
在本题中,我们发现,
当某一数位多个数均为1时,最后的结果始终为0
当且仅当一个数位只有一个数为1时,最后该数位才能为1
也就是说,自顶而下找到每一数位,如果当且仅当一个数满足该条件那么将其放到前面
剩下的数任意输出即可
code:
#include<iostream>
#include<algorithm>
using namespace std;
int a[100010];
int b[50];
int vis[100010];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int j = 31;j>=0;j--)
{
int tmp = 0;
for(int i = 1;i<=n;i++)
{
if((a[i]>>j) & 1==1&&vis[i]==0){
tmp = i;
if(b[j]==1){
b[j] = 0;
break;
}
b[j] = 1;
}
}
if(b[j] == 1){
cout<<a[tmp]<<" ";
vis[tmp] = 1;
// cout<<tmp<<" s"<<endl;
// b[j] = 0;
}
}
for(int i=1;i<=n;i++)
{
if(!vis[i]) cout<<a[i]<<" ";
}
}