題目很短,意思就是有這樣一個函數,功能如圖所示,問如何安排會讓答案最大,
那麼看一下題,函數的功能是先按位或在-b,所以說除了第一個元素都要被減並且按位或,所以我們只需選出一個適合的值放在第一,其他的不重要。
那麼我們繼續觀察這個函數找找規律,比如題中所給的9和6的列字,函數完了以後還是9,但這個例子不夠明顯,那麼我們再試試9和7他們分別是1001和111,按位或還是15,但減7後變成了8也就是1000我們發現如果函數前端是0,那麼結果一定是0,如果都是1,也會變成0。而如果在某一次變化是它變成了0,那麼以後他永遠會變成函數前端的一個性質,所以我們想要求出最大值需要選出儘可能大的只出現1次的1的位置
那麼我們暴力循環即可
代碼如下
#include<bits/stdc++.h>
using namespace std;
long long int a[100005];
int main()
{
long long int n,f,flag,c=0;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int w=31;w>=0;w--)
{
f=0,flag=0;
for(int i=1;i<=n;i++)
{
if(a[i]>>w&1==1)
{
f++;
flag=i;
}
}
if(f==1){
c=15;
break;
}
}
if(c==15)printf("%lld ",a[flag]);
for(int i=1;i<=n;i++)
if(flag!=i||c!=15)printf("%lld ",a[i]);
return 0;
}
需要注意的是,在後期hack數據中加入了一組全是0的數據,也就是沒有出現1的數據,所以我們需要加變量c保證不會額外輸出a【0】