今年是我參加baidu astar的第一年,身為程式設計菜鳥的我,知道自己在初賽就掛了,但是掛歸掛,題目我還是很想在賽後解答的,於是經過一番功夫,現在將初賽第二場的解題思路和**貼出來供大家分享。
【題目】
度度熊就是要刷排名第一
時間限制:
1000ms
記憶體限制:
65536kb 描述
一天度度熊在
遊戲大廳中發現了乙個隱藏的神奇遊戲,叫做
」度度熊的逆襲
」。度度熊很好奇到底是什麼情況,於是就進入了遊戲。這個遊戲很神奇,遊戲會給出n個數
ai,度度熊可以任意從中選取一些數,乙個數可以選任意多次。選好之後度度熊得到的分數為度度熊選出的數的
xor(異或)
值。度度熊頓時產生了興趣,決心要刷至
ranklist
的第一名。但是度度熊犯難了,度度熊不知道自己給出的方案是不是最好的,於是度度熊找到了你,希望你告訴他對於某個回合,度度熊能得到的最高分和第二高分是多少?輸入
第1行1個數
n,接下來1行
n個整數表示
ai, (0 <= ai < 2^31, 並且)
1 <= n <= 10^5 輸出
輸出一行兩個數,表示度度熊能夠得到的最高分和第二高分為多少
樣例輸入 2
5 3樣例輸出
6 5
【解題思路】
題目說每個數可以取多次,令輸入n個數,我們分析容易得,所有可能的組合有:
1.數a[i] 與 數 a[i] 異或,結果為0
2.多個不重複的數異或,記作:a[k1]^a[k2]^a[k3]^......a[km],其中k1,k2,k3.....介於0到n-1(包含0和n-1)
,m<=n
3.由於任意重複的數異或,得值0,而0異或任一值a[k],值仍然是a[k]。故第三類值是a[k],k=0,1,2,3,.....n
經過以上分析之後,我們可以建立乙個陣列,用於容納所有可能的情況的異或值,然後利用遞迴演算法求出第二類的所有異或值,加上0,a[0],a[1],a[2]....a[n-1]等數值一起併入陣列,組後排序,找到最大和次大的值即可。
【**--c++】
/*------------------------------made by marsboy 轉 載 請 注 明 出 處!--------------------------*/
#include using namespace std;
//----global variables
int num;
int i=0,j=0,k=0;
int ord=0;
int *xorval;
int tmp=0;
//----end global variables
void xorcal(int array,int st,int llen);
//遞迴呼叫,列舉所有可能的排列組合的異或情況
void xorcal(int array,int st,int llen)
for(m=2;m<=num;++m)
xornum=xorpnum+num+1;
xorval=new int[xornum];
for(m=num;m>1;--m)
}//將num個輸入值賦給異或陣列
for(i=0;ixorval[m+1]) }
max=xorval[xornum-1];
sec_ord=0;
for(m=0;mxorval[sec_ord] && xorval[m]
【測試資料】
1
1
1 0
3
1 5 9
13 12
百度之星 初賽第二場 B題
怎麼說呢,只能說自己還不夠熟練,能力還不夠,細心成都還不夠吧。這樣的二分題目在poj的訓練計畫裡面有類似的題目,自己也是都刷了,可是在調這道題目的時候廢了老大的盡了,比賽結束後聽polla的一句思路 找出最大的t,如果按t分類,可分出1組,按0分類分出n組,二分列舉t然後利用並查集判斷分出多少種類。...
百度之星 初賽第二場 B題
怎麼說呢,只能說自己還不夠熟練,能力還不夠,細心成都還不夠吧。這樣的二分題目在poj的訓練計畫裡面有類似的題目,自己也是都刷了,可是在調這道題目的時候廢了老大的盡了,比賽結束後聽polla的一句思路 找出最大的t,如果按t分類,可分出1組,按0分類分出n組,二分列舉t然後利用並查集判斷分出多少種類。...
2019百度之星第二場初賽 A, B, C
a 度度熊與數字 直接暴力列舉v的因子 找到答案之後對答案排一下序輸出即可 include define ll long long using namespace std const int maxn 1005 int arr 1000 int arrr 1000 int factor int n ...