2019 CCF非專業級別軟件能力認證第一輪 (CSP-S)提高級 C++答案及解析


此為天天快樂編程2020年OI集訓隊 訓練4-提高組題解,本次訓練題目為2019CSP認證S組原題。
浙江S組入圍線72.5分,入圍人數共1148名,有效參加共2153人。
試卷下載

一、單項選擇

1. 答案:D

解析:x+y轉整數等於7,取模運算與乘法優先級一樣,所以7%3*7%2=1

2. 答案:C

解析:WMV是音頻、MPEG、AVI是視頻、JPEG是圖像。

3. 答案:D

解析:或運算,有1得1,將兩個數字進行右對齊,14進行或運算均為1。

4. 答案:B

解析:編譯器將高級語言(例如C++、java、pascal等人類比較容易看的懂的)翻譯成低級語言(機器語言,方便機器執行,因為機器只認識01)。

5. 答案:B

解析:x的類型是float, 所以(x*100+0.5)也是float, 也就是有小數位,需要先轉黃成int格式, 也就是B選項。

6. 答案:B

解析:暴力枚舉
1.當取出1,1,2,4時,共有C(2,4)*2=12種;
2.當取出1,1,2,8,也是12種;
3.當取出1,1,4,8,也是12種;
4.當取出1,1,8,8,為C(2,4)是6種;
5.當取出為1,2,4,8,為A(4,4)=20 種;
6.當取出1,2,8,8,為12種;
7.當取出1,4,8,8為12種,
8.當取出2,4,8,8為12種。
一共102種情況。
這個題目比較難

7. 答案:C

解析:穩定排序就是記錄的相對次序保持不變。
快速排序判斷的有相等的元素,很有可能把前面的元素的穩定性打亂。比如序列為 5 3 3 4 3 8 9 10 11, 現在頭指針元素5和3(第5個元素,下標從1開始計)交換就會把元素3的穩定性打亂,所以快速排序是一個不穩定的排序算法,不穩定發生在頭指針元素和a[j] 交換的時刻。
堆排序、快速排序、希爾排序、直接選擇排序是不穩定的排序算法,而基數排序、冒泡排序、直接插入排序、折半插入排序、歸並排序是穩定的排序算法。
這個題目如果不了解也不好做

8. 答案:B

解析:完全圖邊數=n*(n-1)/2。於是28條邊的聯通圖至少需要8個點,但是本題說的是非聯通圖,再多加一個孤立點,8+1=9。

9. 答案:B

解析:前2位有0,1,8,6,9,5種選擇,第3位只能放0,1,8,后2位由前2位決定。而0,1,8模3正好余0,1,2,所以給定其他4位,第3位有且僅有1種選擇,總數=55111=25。
這個題目比較難

10. 答案:A

解析:容斥原理,總滿分人數=數學滿分+語文滿分-語文數學滿分=15+12-4=23。

11. 答案:D

解析:一個數組被取完后就不需要比較了,所以最好情況n次最壞情況2n-1。

12. 答案:D

解析:鄰接矩陣和鄰接表可以存儲圖,其他三項都是數據結構,不是存儲結構。

13. 答案:B

解析:Dijkstra算法需要每次選取d[i]最小的邊;Prim算法需要每次選在集合E中選取權值最小的邊;kruskal剩下的所有未選取的邊中,找最小邊。Floyd是動態規划不是貪心。

14. 答案:B

解析:設公比是p,那么2 * p ^ (2n-2)=118098, 2 * p ^ (n-1)=486,可以得到p^(n-1)=243,由於gcd(2,243)=gcd(4,243)=gcd(5,243)=1,所以排除2,4,5,而gcd(3,243)=3,所以公比可能是3。

15. 答案:A

解析:數字三角形原題。每個點的只能夠從C(i-1,j-1)以及C(i-1,j)過來,所以最優解肯定是從更大的那個節點到,所以結果包含max(C(i-1,j-1), C(i-1,j)), 而計算的是和所以也包含aij這一項。

二、閱讀程序

16. 12行if判斷如a[i]比前一位小,則從i開始,否則從上次開始14行while循環找ans向后找第一個>a[i]的數12行的判斷的意思是,如果后項<=前項,則重新開始,否則從上項開始。整個程序含義是找每個a[i]后第一個大於a[i]的位置。

1)答案:錯

解析:12行if成立,14行while不成立,則16行ans==i

2)答案:對

解析:13行i<=n,15行ans<n才會自增,所以不會超過n

3)答案:對

解析:12行只是一個優化,刪掉會變慢

4)答案:對

解析:14行,由於ans是第一個大於a[i]的,所以a[i+1]..a[ans-1]都不超過a[i],結論成立

5)答案:D

解析:單調增,則12行if不會成立,也就是ans只增不減所以復雜度為O(n)

6)答案:A

解析:最壞情況下,12行if總是成立(a單調減)此時14行也會一直運行到ans=n,復雜度為1+2+..+n=O(n^2)

17.利用並查集,而且並查集沒有進行路徑壓縮,記錄下了深度

1)答案:對

解析:並查集初始化下標是[0,n-1]

2)答案:錯

解析:並查集初始化自己的爸爸是他自己,findRoot里也有fa[v]==v

3)答案:對

解析:fa[i]表示i的父親,下標也在0~n-1范圍內

4)答案:錯

解析:a和b相等時,cnt[i]的值翻倍,會超出n

5)答案:C

解析:每兩次合並x和y都不同,表示每次都是單獨一個去和整體合並。此時cnt[y]增加cnt[x]的值,也就是加1。1*1+1*2+...1*49=50*49/2=1225

6)答案:C

解析:並查集getRoot函數沒有路徑壓縮,單次查找最壞為O(n),壓縮后效率是logn。總效率為O(n^2)

18.從s中刪去若干個字符,可以得到t。這個題目比較困難。可以采用“代入簡單數據”的大法,畫一個表,來看一下每一行代碼的作用。

1)答案:對

解析:suf[i]是滿足t[suf[i]+1..tlen-1]為s[i..slen-1]子序列的最小值

2)答案:錯

解析:題目的輸出為s中刪去連續多少個字母后t仍然是s的子序列;,兩者相等時結果為0。

3)答案:錯

解析:第一輪執行22行時tmp=0,j=0不執行,因此這輪j-i-1就可能是負數。

4)答案:錯

解析:如果t是s的子序列,那么0pre[i]-1,suf[i+1]+1lent-1這部分分別是s[0 ~ i],s[i+1 ~ lens-1]的子序列,不會重疊,所以有pre[i]-1<suf[i+1]+1,也就是pre[i]<=suf[i+1]+1

5)答案:D

解析:slen是s的長度,至少需要輸入一個長度的字符串,如果t不是s子序列那輸出一定是0

6)答案:C

解析:輸出是2說明s串刪去兩個連續元素后t仍是s的子序列,因此刪去后長度至少為10,刪前至少為12

三、完善程序

19.本題屬於一個模擬題,不過完善程序已經變為選擇題,還是好做多了。

1)答案:C

解析:unlock作用是看是否能解鎖任務。根據對問題5的分析,在未解鎖前它的值是還有幾個依賴任務未解鎖。那么解鎖條件當然是0個依賴任務,因此是等於0

2)答案:D

解析:解鎖條件二,經驗點要大於等於任務的需求點

3)答案:D

解析:可以推測出這里進行經驗累加的地方,其他三個也可以通過排除法進行排除。

4)答案:C

解析:從前面分析看出unlock是依賴的還沒解鎖的任務數,解鎖一個任務,所有依賴這個任務的unlock值都要減1

5)答案:B

解析:m是任務依賴的任務數,從前面代碼看出當unlock[i]為-1時表示解鎖成功,那么D不對。A的話cnt[i]此時還沒完成賦值,也不對。C有迷惑性,認為unlock是布爾值,但看題目m個依賴任務完成才能解鎖該任務,所以不是單純的布爾,需要每解鎖一個前置任務就將unlock減1,直到為0

20.首先使用f(i)表示有i個石子時,是否有必勝策略。所以f(i)=!f(i-b[j1]) or !f(i-b[j2]) ...) (a[j]<=i), 轉換公式,status中每一位定義為win(i-j), 也就是有i-j有必勝策略。這個題目比較新潮,是NIM博弈,而且還有狀態壓縮,據說本題是很多人的第一次狀壓。但是部分題目還是可以猜出答案。

1)答案:C

解析:第一空需要填寫初始狀態,石子有0個,怎么樣都是輸的。然后trans相當於記錄當前狀態下能夠必勝的策略位置也就是b[j]的集合。

2)答案:B

解析:能轉移的狀態數不會減少

3)答案:A

解析:將b[j]加到trans里面(記錄新增的能夠必勝的位置)

4)答案:D

解析:要往status記錄新的必勝策略的位置

5)答案:D

解析:當前狀態下能走到的先手必輸的情況不為空。要將status狀態更新,具體就是將當前的win記錄到status的最低位上即可


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM