二、閱讀程序
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個約數,用枚舉法也能輕易排除其他三個選項。

程序分析: 有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。


①處應填( ) A. ++cnt[i] B. ++cnt[b[i]] C. ++cnt[a[i]*maxs+b[i]] D. ++cnt[a[i]]
解析:B。先對第二關鍵字進行計數。
NOIP信息學視頻地址
視頻地址
鏈接:https://pan.baidu.com/s/1tHo1DFMaDuMZAemNH60dmw
提取碼:7jgr