2020CSP初賽試題答案解析
目錄
1.CSP-J試題(C++A卷)
2.CSP-J答案(C++A卷)
3.CSP-J試題(C++B卷)
4.CSP-J答案(C++B卷)
5.CSP-S試題(C++A卷)
6.CSP-S答案(C++A卷)
7.CSP-S試題(C++B卷)
8.CSP-S答案(C++B卷)
9.CSP-S解析
a.選擇題
不用多說了吧,最後一題上網查查克勞德·艾爾伍德·夏農
b.閱讀程式
T1
找出一大一小的數的按位或運算後的最大值。
n可以等於1000;當所有d[ i ]相等時ans=-1;當只列舉i後面的數時會少列舉在i之前的比i大的數,例如一個降序排列序列;不等於包含小於,答案不變。
或的最大值不可能大於127
兩個偶數二進位制下最低為為0,輸出才能為偶數。
T2
用快排的思想找第k小的數。
x範圍[L,R];while結束後當L!=R時 d[ a ]=d[ b ],L=R時d[ a ]!=d[ b ]但是d[ b ]一定沒有問題;
平均時間複雜度的計算,不是很懂。
最好情況,a-L==k時就退出,O(n);最壞情況下第一層執行n次,第二層執行n-1次,....O(n^2)。
T3
給你兩個字串st0、st1和k ,有如下操作:
1.將st0的0~m位的字元整體右移一位,超出的一分放到左邊;
2.將st0的m~len-1位的字元整體左移一位,超出的一個移到右邊;
問從st0變成st1的最少步數。
原程式用雙向bfs實現。
最壞時間複雜度為O(( N! )^2 )
兩個倒序的字串無論如何通過上述操作都不能互相轉化。
68手動模擬一下即可。
c.完善程式
T1
貪心。
注意int不能直接整除,要交叉相乘後比較。
當curV+v[i]>B時,v[ i ]這個物品只能被分成B-curV個單位體積。
此時
T2
經典的平衡規劃。
x^=x&(x^(x-1))就是lowbit,手動模擬一下可以發現。
x為a的高8為,x=a>>8
設f[ x ][ y ]表示當前新加入的數高8位為x,以之前某一個後8位為y的數為序列結尾的最大價值。
先轉移,v =max { f[ x ][z ] +w( y^z )},初值當然為0。
更新時用 v+( w( x^z )<<8 ) 去更新 f[ z ][ y ]即可。