2019 CSP-S / NOIP提高組初賽試題解析 (下)


二、閱讀程序

1.

 

 程序分析: 本段程序的目的是找到每個a[i]之后第一個大於a[i]的位置(下標ans+1)。代碼簡單,即使看不懂也可以代入幾個數字去試驗,畢竟選擇題。

1) 第16行輸出ans時,ans的值一定大於i。( )

解析:錯。只要14行while循環不執行,則ans=i,如n=1,則ans等於i。

2) 程序輸出的ans小於等於n。( )

解析:對。ans初始值為i小於n,且小於n是其自增的一個條件,顯然不會超過。

3) 若將第12行的“<”改為“!=”,程序輸出的結果不會改變。( )

解析: 對。改成!=只是增加了一些沒意義的比較,對結果沒有影響。

4) 當程序執行到第16行時,若ans-i>2,則a[i+1]≦a[i]。( )

解析:對。因為ans+1是第一個大於a[i]的位置,所以從a[i+1]至a[ans]都是小於等於a[i]的。

5) 若輸入的a數組是一個嚴格單調遞增的數列,此程序的時間復雜度是( )。A.O(logn) B.O(n^2)C.O(nlog n) D. O(n)

解析:D。嚴格單調遞增則14行必定不執行,while循環每次只執行一次,時間復雜度為n。

6) 最壞情況下,此程序的時間復雜度是( )。A. O(n^2) B. O(logn)C. O(n) D. O(nlog n)

解析:A。最壞的情況為嚴格單調遞減,14行if判斷每次都執行,while循環每次都查找到n,時間復雜度為n+(n-1)+……+2+1=n*(n+1)/2,即O(n^2)。

2、

 

 程序分析: 本題就是一個並查集操作,getRoot函數是查詢根節點,循環中對集合進行合並。

1) 輸入的a和b值應在[0,n-1]的范圍內。( )

解析:對。輸入的a、b是集合的下標,自然應該在[0,n-1]之間。

2) 第16行改成“fa[i]=0;”, 不影響程序運行結果。( )

解析:錯。未合並前初始根節點是其本身,為0顯然不符合題意。

3) 若輸入的a和b值均在[0, n-1]的范圍內,則對於任意0≤i<n,都有0≤fa[i]<n。( 

解析: 對。fa[i]是根節點,不管在怎么合並,根節點必然也是在[0,n-1]之間。

4) 若輸入的a和b值均在[0,n-1]的范圍內,則對於任意0≤i<n,都有1≤cnt[i] ≤n。

解析:錯。cnt[i]是合並之后集合的元素個數,嚴謹的並查集操作cnt[i]是不會超過n的,但是本題沒有判斷是否重復合並。所以如果先輸入(1,2),(3,4),之后一直不斷輸入(2,4),最后cnt[4]會超過n。

5) 當n等於50時,若a、b的值都在[0,49]的范圍內,且在第25行時x總是不等於y,那么輸出為( )。
A.1276 B.1176 C.1225 D.1250
解析:C。本題前提下cnt[i]表示當前集合的元素個數,每次執行都是兩個集合合並,我們可令每次都是單個集合合並進入大集合,ans=1*1+1*2+1*3+……1*48+1*49=49*(49+1)/2=1225。
 
 
6) 此程序的時間復雜度是( )。A. O(n) B. O(logn) C. O(n^2) D. O(nlogn)
解析:C。getRoot是依次查找上一個父元素,沒有“壓縮路徑”,時間復雜度最差為n,所以總的時間復雜度為n^2。
 
 
3、

 

 

 

 程序分析: 本題主要需了解兩個數組的含義,pre[i]表示s[0..i]至多可以從前往后匹配到t串的哪一個字符,此時t[0..pre[i]-1]是s[0..i]的子序列。sub[i]用於記錄s[i..slen-1]至多從后到前匹配到t的哪一個字符,此時t[suf[i]+1..tlen-1]是s[i..slen-1]的子序列。本題是求s中連續刪除至多幾個字母后,t仍然是s的子序列。

1) 程序輸出時,suf數組滿足:對任意0≤i<slen,suf[i] ≤suf[i+1]。( )

解析:對。從15至19行可以看出,sub數組的值是從尾部往前減小或不變,所以suf[i] ≤suf[i+1]。

2) 當t是s的子序列時,輸出一定不為0。( )
解析:錯。有題目目的可知,當t==s時輸出為0。
3) 程序運行到第23行時,“j-i-1”一定不小於0( )
解析: 錯。若第一循環時while不執行,則j-i-1為-1,如s=”bacb”,t=”ac”。
4) 當t是s的子序列時,pre數組和suf數組滿足:對任意0≤i<slen,pre[i]>suf[i+1]+1( )
解析:錯。由含義可知若t是s子序列,t[0..pre[i]-1],t[sub[i+1]+1..lent-1]是s[0..i],s[i+1..lens-1]的子序列,不會重疊,即pre[i]-1< sub[i+1]+1,即pre[i] <= sub[i+1]+1。
5) 若tlen=10,輸出為0,則slen最小為( )。A. 10 B. 12C.0 D.1
解析:D。若t不是s子串(或t==s)輸出都為0,但為保證程序執行,最少應輸入一個字符。
6) 若tlen=10,輸出為2,則slen最小為( )。A.0 B.10C.12 D.1
解析:C。輸出為2說明slen最多連續刪除2個后為10,所以最小為12。
 
三、完善程序
 
Ps:程序完善提不貼題目了,請自己去看原卷。
1.程序分析: 程序每次都先學習一個已經達到條件但為學習的技能,學習后更新經驗值和其他技能與該技能有關的學習條件,不斷重復至沒有技能可以學。unlock數組為對應技能需學習的前置技能數,大於0說明有前置技能要學,為-1表示已學習。
1) ①處應填( )A. unlock[i]<=0B. unlock[i]>=0C. unlock[i]==0D. unlock[i]==-1
解析:C。學習技能條件一,需要的前置技能數為0且為學習。
2) ②處應填( )A. threshold[i]>pointsB. threshold[i]>=pointsC. points>threshold[i]D. points>=threshold[i]
解析:D。學習技能條件二,總經驗達到該技能的經驗要求。
3) ③處應填( )A. target = -1B. --cnt[target]C. bbonus[target]D. points += bonus[target]
解析:D。技能學習后總經驗增加。
4) ④處應填( )A. cnt [child[target][i]] -=1B. cnt [child[target][i]] =0C. unlock[child[target][i]] -= 1D. unlock[child[target][i]] =0
解析:D。即使看不懂,也應該猜到是學完技能后,相關技能的前置條件-1。
5) ⑤處應填( )A. unlock[i] = cnt[i]B. unlock[i] =mC. unlock[i] = 0D. unlock[i] =-1
解析:B。定義每個技能學習需要的前置技能數。
 
2.請自己去看原卷。
程序分析:通常我們可以設置bool數字f[i]表示有i個石子時有無先手必贏策略。若對於i個石子有先手必贏策略,則存在j(a[j]<=i且b[j]<=i)使得i-b[j]個石子先手無必贏策略,則得到轉移方程f[i]=OR{!f[i-b[j]} (a[j]<=i且b[j]<=i)。因為本題策略數和數組b數字都不超過64,所以僅考慮f[i-1]..f[i-64],可將其狀態壓縮至一個64位數中。其中status用於記錄對於i個石子,i-1..i-64是否有先手必勝策略。
1)①處應填( )
A.0      B .~0ull           C.~0ull^1         D.1
解析:C。根據題目要求,狀態壓縮到64位,A和D默認是32位整數,所以B或者C。最開始石子是0個,應該是輸的狀態,所以最低位不能是1,選C。
2)處應填( )
A.a[j]< i        B.a[j]==i          C.a[j] !=i       D.a[j] >i
解析:B。題目實現有將規則按a[i]進行從小到大排序,所以可使用規則只增加不減少。此循環用於增加當前可選的規則,當i達到a[j]時規則可以使用。
3)③處應填( )
A. trans |= 1ull <<(b[j] - 1)           B. status |= 1ull << (b[j]- 1)           C. status += 1ull << (b[j]-1)        D. trans += 1ull<< (b[j]-1)
解析:A。此行是用來在原有規則上,新增”取b[j]個棋子”的規則。二進制新增用|。
4)④處應填( )
A. ~status|trans             B. status&trans       B. status|trans       D. ~status&trans
解析:D。
5)⑤處應填( )
A. trans = status | trans ^win       B. status = trans >> 1^win            C. trans = status ^trans |win          D. status =status <<1^win
解析:D。
 

NOIP信息學視頻地址

視頻地址

鏈接:https://pan.baidu.com/s/1tHo1DFMaDuMZAemNH60dmw 
提取碼:7jgr

 


免責聲明!

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



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