NOIP 2018提高組初賽C/C++答案詳解

一、單項選擇題

1 D 思路: 這種題一般先算2,8,16進制的,十進制難算,另三個很好互相轉。

分析: 二進制化八進制:從低位(右)往高位(左),每三位直接換成八進制即可。 (1001101011)2 = (10 0110 1011)2 = (26B)16 二進制化十六進制:從低位(右)往高位(左),每四位直接換成十六進制即可。 (1001101011)2 = (1 001 101 011)2 = (1153)8 這裏可以看出,D答案和A、C答案都不相同,答案必然就是D。

可以進一步將八進制轉化成十進制和十六進制。 十進制:(1151)8 = (1 * 83 + 1 * 82 + 5 * 8 + 1)10 = (512 + 64 + 40 + 1)10 = (617)10 十六進制:(1151)8 = (1 001 101 001)2 = (10 0110 1001)2 = (269)16

2 D (一)定義: 編譯型語言:把做好的源程序全部編譯成二進制代碼的可運行程序。然後,可直接運行這個程序。 解釋型語言:把做好的源程序翻譯一句,然後執行一句,直至結束! (二)區別: 編譯型語言,執行速度快、效率高;依靠編譯器、跨平臺性差些。 解釋型語言,執行速度慢、效率低;依靠解釋器、跨平臺性好。 (三)分類 編譯型的語言包括:C、C++、Delphi、Pascal、Fortran 解釋型的語言包括:Java、Basic、javascript、Python。 (四)特例Java 個人認爲,java是解釋型的語言,因爲雖然java也需要編譯,編譯成.class文件,但是並不是機器可以識別的語言,而是字節碼,最終還是需要 jvm的解釋,才能在各個平臺執行,這同時也是java跨平臺的原因。所以可是說java即是編譯型的,也是解釋型,但是假如非要歸類的話,從概念上的定義,恐怕java應該歸到解釋型的語言中。

1-2.png

3 B 1984年鄧小平指出:“計算機的普及要從娃娃做起。”教育部和中國科協委託中國計算機學會舉辦了全國青少年計算機程序設計競賽(簡稱:NOI),1984年參加競賽的有8000多人。這一新的活動形式受到黨和政府的關懷,得到社會各界的關注與支持。

4 A (1)相關概念 ① 二叉樹:樹中每個節點至多有兩個子節點 ② 二叉搜索樹:對於樹中任何節點,如果其左子節點不爲空,那麼該節點的value值永遠 >= 其左子節點;如果其右子節點不爲空,那麼該節點的value值永遠 <= 其右子節點 ③ 滿二叉樹(完美二叉樹):樹中除了葉子節點,每個節點都有兩個子節點 ④ 完全二叉樹:最後一層的葉子節點均需在最左邊(上層的結點沒有排滿不能排下層的,左邊的結點沒排滿不能排右邊的)

1-4-1.jpg

(2)根結點的深度 通常算做0或是1,具體是0還是1無所謂,保證程序上下文統一即可。 題目中明確指出了根結點是0,所以上面左圖中的深度是3,不是4。 (3)解法一:舉特例 k = 2時,即滿二叉樹。 上面左圖中,h = 3, 結點總數爲15 = (23+1 - 1) / (2 - 1),A答案對,其他答案都錯。

解法二:高年級的學生還可以直接用等比數列求和公式

1-4-2.gif

注意,這裏是h + 1層,不是h層。所以分子公比的冪是h + 1。

5 D 這題跟2015年普及組的第19題完全一樣。 解法一: T(n) = T(n - 1) + n = T(n - 2) + (n - 1) + n = T(n - 3) + (n - 2) + (n - 1) + n = T(1) + 2 + …… + (n - 2) + (n - 1) + n = T(0) + 1 + 2 + …… + (n - 2) + (n - 1) + n = 1 + n*(n + 1) / 2 = n2 / 2 + n / 2 + 1 最高階是n2,所以時間複雜度爲n2 。

解法二: 因爲T(n) - T(n - 1) = n, 求和

1-5.png

6 B 2017年普及組考了後綴表達式,這裏考的是前綴表達式。 (一)後綴表達式(逆波蘭表達式) 中綴表達式轉換成後綴表達式的規則: (1)遇到操作數:直接輸出(添加到後綴表達式中) (2)棧爲空時,遇到運算符,直接入棧 (3)遇到左括號:將其入棧 (4)遇到右括號:執行出棧操作,並將出棧的元素輸出,直到彈出棧的是左括號,左括號不輸出 (5)遇到其他運算符:加減乘除:彈出所有優先級大於或者等於該運算符的棧頂元素,然後將該運算符入棧 (6)最終將棧中的元素依次出棧,輸出

對於a * d - b * c, (1)打印a (2)* 入棧 (3)打印d (4)* 優先級大於 -, * 出棧並打印, - 入棧 (5)打印b (6)打印c (7)* 出棧並打印 (8)- 出棧並打印 所以,後綴表達式的打印順序爲 a d * b c * - (二)前綴表達式(波蘭表達式) 中綴表達式轉前綴表達式的規則: (1) 初始化兩個棧:運算符棧S1和儲存中間結果的棧S2; (2) 從右至左掃描中綴表達式; (3) 遇到操作數時,將其壓入S2; (4) 遇到運算符時,比較其與S1棧頂運算符的優先級: (4-1) 如果S1爲空,或棧頂運算符爲右括號“)”,則直接將此運算符入棧; (4-2) 否則,若優先級比棧頂運算符的較高或相等,也將運算符壓入S1; (4-3) 否則,將S1棧頂的運算符彈出並壓入到S2中,再次轉到(4-1)與S1中新的棧頂運算符相比較; (5) 遇到括號時: (5-1) 如果是右括號“)”,則直接壓入S1; (5-2) 如果是左括號“(”,則依次彈出S1棧頂的運算符,並壓入S2,直到遇到右括號爲止,此時將這一對括號丟棄; (6) 重複步驟(2)至(5),直到表達式的最左邊; (7) 將S1中剩餘的運算符依次彈出並壓入S2; (8) 依次彈出S2中的元素並輸出,結果即爲中綴表達式對應的前綴表達式。

對於a * d - b * c, (1)從右往左掃描,遇到操作數c,壓入S2 (2)遇到運算符 * , 壓入S1 (3)遇到操作數b,壓入S2 (4)遇到運算符 - ,因爲 - 優先級低於 * ,將 * 從S1中彈出並壓入S2,再將 - 壓入S1 (5)遇到操作數d,將d壓入S2 (6)遇到運算符 * ,因爲 * 優先級高於S1內的 - ,將 * 壓入S1 (7)遇到操作數a,將a壓入S2 (8)彈出S1中的 * ,並壓入S2;再彈出S1中的 - ,並壓入S2 (9)將S2中的所有元素挨個彈出,即 - * a d * b c

7 B ① 求X的分佈函數 在(0,1)線段上任意投兩點(M, N)~(0,1)×(0,1)的均勻分佈。0 < x < 1時,F(x) = P(X < x) = P(|M - N| < x) = 陰影部分的面積S。

1-7-1.png

1-7-2.png

8 A 這題證明較難,可用舉例法來做。 n = 2時,卡特蘭數 Cn = (2 2)!/3!/2! = 4!/(3!2!) = 2

答案A,n + 1 = 3個結點的二叉樹有五種不同的形態。故A錯。

1-8-1.png

答案B,2對括號的合法序列有兩種: ()()和(()) 但這隻能說明n = 2時是對的。

答案C,元素A先入棧,B後入棧,有兩種出棧方式。 A入棧,A出棧,B入棧,B出棧。這種情況下,出棧順序爲A B A入棧,B入棧,B出棧,A出棧。這種情況下,出棧順序爲B A 但這隻能說明n = 2時是對的。

答案D,四邊形分成三角形的方法數有兩種:

1-8-2.png

9 D 本題等價於另一個模型:某地區重男輕女,生了女孩就繼續生直到生了男孩爲止,這樣並不會使人口性別失衡。 假如這個國家有n對夫婦,因爲生男生女概率是一樣的,第一輪生時,一半的夫婦生男孩,停止生育;另一半的夫婦生女孩,會繼續生育。如下圖所示:

1-9.png

男孩和女孩的總數都是n/2 + n/4 + n/8 + …… 從這個圖可以看出來,生男孩和生女孩的比例是一樣的。 如果策略可以改變概率結果,那麼早就沒有女人了,男人也緊接着消失,人類就滅亡了。哈哈。

這會引出另一個問題: 中國很多地方尤其是農村和邊遠山區,也重男輕女。既然策略不能改變男女比例,爲何中國男女比例失衡(男多女少)? 好吧,這個問題過於陰暗,這裏就不深究了。

10 B 這種題如果不會做,每個答案可以舉三個數來枚舉。 這些數要有獨特的特徵,既要考慮特殊性,也要考慮一般性。 第一個數裏面全是1,比如“111”。 第二個數裏只有最高位是1,其他位都是0,比如“100”。 第三個數裏1和0各個一半,比如“1010”。

A答案,x >>= 1,是表示x右移1位,即變爲原來的一半。

例1:111

第一次循環,ret = 1, x = 11 第二次循環,ret = 2, x = 1 第三次循環,ret = 3, x = 0,循環結束

例2:100

第一次循環,ret = 1, x = 10 第二次循環,ret = 2, x = 1 到這裏可以看出A答案肯定是錯的。

B答案,x &= x - 1,表示x與x - 1取與後,把結果賦給x

例1:111

第一次循環,ret = 1, x = 110 第二次循環,ret = 2, x = 010 第三次循環,ret = 3, x = 0

例2:100

第一次循環,ret = 1, x = 0,循環結束

例3:1010

第一次循環,ret = 1, x = 1000 第二次循環,ret = 2, x = 0循環結束 三個例子都是對的,是正確答案的概率很大。但也不能斷定,因爲只要能找到一個反例,就說明這個答案不對。所以要看剩下的兩個答案。

C答案: x |= x >> 1,表示把x與x的一半求或運算的結果賦值給x

例1:111

第一次循環,ret = 1, x = 111,出現死循環

D 答案:x << 1表示x變爲原來的兩倍,肯定不對。此時確定答案爲B。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章