1. 程式人生 > 實用技巧 >2020CSP初賽試題答案解析

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解析


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)。

T(n)=n+\sum_{x=1}^{n}\frac{T(x)+T(n-x)}{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個單位體積。

此時a=\frac{B-curV}{v[i]} ans=curW+a*w[i]=curW+\frac{(B-curV)*w[i]}{v[i]}=\frac{curW*v[i]+(B-curV)*w[i]}{v[i]}

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 ]即可。

詳解網址:https://live.polyv.cn/watch/1946668