2019[CSP/NOIP]初賽普及組解析(下)


二、閱讀程序

1.

 

 程序分析: 對於輸入字符串中的第i位,如果i是n(字符串長度)的約數,並且第i個字符比'a'(97)要大,就-'a'+'A',即小寫轉大寫操作

1) 輸入的字符串只能由小寫字母或大寫字母組成。( )

解析:錯。可以輸入數字或符號。

2) 若將第8行的“i=1”改為“i=0”,程序運行時會發生錯誤。( )

解析:對。i為0時取模會報錯

3) 若將第8行的“i<=n”改為“i*i<=n”,程序運行結果不變。( )

解析: 錯。約數是可能超過sqrt(n)的,范圍縮小了

4) 若輸入的字符串全部由大寫字母組成,那么輸出的字符串就跟輸入的字符串一樣。( )

解析:對。大寫的ASCII值小於小寫,字符不進行變換。

5) 若輸入的字符串長度為18,那么輸入的字符串跟輸出的字符串相比至多有( )個字符不同。

A.18 B.6 C.10 D.1解析:B。18的約數有6個(1、2、3、6、9、18)。

6) 若輸入的字符串長度為( ),那么輸入的字符串跟輸出的字符申相比,至多有36個字符不同。

A.36 B.100000 C.1 D.128

解析:B。10000 = 2^5 * 5^5,一共有(5 + 1) * (5 + 1) = 36個約數,用枚舉法也能輕易排除其他三個選項。

2.

 

 

 

 程序分析: 有a、b兩組元素,兩組元素之間可以兩兩對應。初始時所有元素都和另一組的0對應。每次考察a組的第x個元素和b組的第y個元素,如果這兩個元素之前的配對交叉了,則把它們之前的配對元素重置為0,並將這兩個元素配對。

1) 當m>0時,輸出的值一定小於2n。( )

解析:對。m>0至少一個配對,多以結果必小於2n。

2) 執行完第27行的“++ans”時,ans一定是偶數。( )

解析:錯。本題相當於兩個數組間由若干條線有對照關系,最終的ans必定為偶數,但是單邊不一定。

3) a[i]和b[i]不可能同時大於0。( )

解析: 錯。令m=1,輸入x=1,y=1時, a[i]和b[i]同時為1。

4) 程序執行到13行時,x總是小於y,那么第15行不會被執行。( )

解析:錯。若果x之前已經配對過,則會重新更新,反例:(1,2)、(1,3)。

5) 若m個x兩兩不同,且m個y兩兩不同,則輸出的值為( )。

A. 2n-2m B.2n+2 C.2n-2 D.2n

解析:A。m次循環中會有2m個位置的值會變化,ans=2n-2m。

6) 若m個x兩兩不同,且m個y都相等,則輸出的值為( )。        A.2n-2        B.2n         C.2m           D.2n-2m

解析:A。x和y配對時每次都會清理掉之前的配對,最終只會產生一組配對,所以和0配對的元素數量為2n - 2

3.

 

 

 

 程序分析: 將數組b根據數組a值構造成一棵二叉樹,每次在序列中選擇a值最小且最靠前的元素作為根,根之前的序列構建左子樹,根之后的序列構建右子樹。最后求每個節點值b[i]乘深度deep的和。

1) 如果a數組有重復的數字,則程序運行時會發生錯誤。( )

解析:錯。每次是找第一次出現的最小值,重復不影響。

2) 如果b數組全為0,則輸出為0。( )

解析:對。最后求每個節點值b[i]乘深度deep的和。

3) 當n=100時,最壞情況下,與12行的比較運算執行的次數最接近的是( )A.5000 B.6000 C.6 D.100

解析: A。最壞情況為每次的min都在最左或最右,一次只能構建單側子樹,每層只少一個點。則總比較次數為100+99+98+……+1 = 5050。

4) 當n=100時,最好情況下,與12行的比較運算執行的次數最接近的是 ( )A.100 B.6 C.5000 D.600

解析:D。最好情況是每次min都在序列中間,剛好平分兩個子樹,則深度大致為log(100)≈6,每層大概執行100次。

5) 當n=10時,若b數組滿足,對任意0≤i<n,都有b[i]=i+1,那么輸出最大為(

A.386 B.383 C.384 D.385

解析:D。最大值為權值最大的深度最深,結果為10*10+9*9+8*8+……2*2+1*1=385。

6) 當n=100時,若b數組滿足,對任意0≤i<n,都有b[i]=1,那么輸出最小為( )。
A.582 B.580 C.579 D.581
解析:B。即構造一個100節點的二叉樹,想要值最小則盡可能弄成完全二叉樹。
 
三、完善程序
1.

 

 

 

 
 
① 處應填( )
A.n%2 B.0 C.t D.1
解析:C。res僅有這處賦值,從題意和遞歸調用時t的賦值可知為t。
② 處應填( )
A.x-step,y-step B.x,y-stepC.x-step,y D.x,y
解析:D。四次遞歸調用代表一個數擴充為4個,x、y是其坐標,②處為左上,坐標不變。
③ 處應填( )A. x-step,y-step B. x+step,y+stepC. x-step,y D. x,y-step
解析:B。四次遞歸調用代表一個數擴充為4個,x、y是其坐標,③處為右下,x、y均增加。
④ 處應填( )A.n-1,n%2 B.n,0 C.n,n%2 D.n-1,0
解析:B。第一次調用recursive函數,n是矩陣規模,初始為n,t是取反次數,所以t初始為0。
⑤ 處應填( )A.i<<(n+1) B.1<<n    C.n+1      D.1<<(n-1)
解析:B。size是輸出矩陣的邊長,2^n,位運算是1<<n。
 
2

 

 

 

 ①處應填( )      A. ++cnt[i]         B. ++cnt[b[i]]           C. ++cnt[a[i]*maxs+b[i]]            D. ++cnt[a[i]]

解析:B。先對第二關鍵字進行計數。

②處應填 ( )A. ord[--cnt[a[i]]]=iB, ord[--cnt[b[i]]]=a[i]C. ord[--cnt[a[i]]]=b[i]D. ord[--cnt[b[i]]]=i
解析:D。cnt[b[i]]表示按第二關鍵字排序,第i個數排第幾位。Ord[i]表示第i小的數在原序列的位置
 
③處應填( )A. ++cnt[b[i]]B. ++cnt[a[i]*maxs+ b[i]]C, ++cnt[a[il]D. ++cnt[i]
解析:C。再對第一關鍵字進行計數。
 
④處應填( )A. res[--cnt[a[ord[i]]]]=ord[i]B. res[--cnt[b[ord[i]]]]=ord[i]C. res[--cnt[b[i]]]=ord[i]D. res[--cnt[a[i]]]=ord[i]
解析:A。再對第一關鍵字進行計數。res[i]表示第一關鍵字第i小的數在原序列的位置。
 
⑤處應填( )A. a[i],b[i]B. a[res[i]], b[res[i]]C. a[ord[res[i]]], b[ord[res[i]]]D. a[res[ord[i]]], b[res[ord[i]]]
解析:B。res[i]記錄第i個數的在原序列的位置。且a、b數組內容必然成對輸出,下標必須一致,也可以簡單猜測選B。
 

NOIP信息學視頻地址

視頻地址

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

 
 


免責聲明!

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



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