codeforce 618div2 C Anu Has a Function

在這裏插入圖片描述
題目很短,意思就是有這樣一個函數,功能如圖所示,問如何安排會讓答案最大,
那麼看一下題,函數的功能是先按位或在-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】

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章