1. 程式人生 > >NOIP 2018提高組初賽C/C++答案詳解

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。

二、多選題


欲購完整答案請加微信307591841
瞭解小朋友學程式設計請加QQ群581357582
關注公眾號請掃描二維碼
qrcode_for_kidscode_258.jpg