資源簡介 第十六屆全國青少年信息學奧林匹克聯賽初賽試題試題及答案NOIP2010(Pascal提高組)一、單項選擇題1.與16進制數 A1.2等值的10進制數是 ( )A.101.2 B.111.4 C.161.125 D.177.252.一個字節(byte)由( )個二進制組成。A.8 B.16 C.32 D.以上都有可能3.以下邏輯表達式的值恒為真的是( )。A.P∨(┓P∧Q)∨(┓P∧┓Q)B.Q∨(┓P∧Q)∨(P∧┓Q)C.P∨Q∨(P∧┓Q)∨(┓P∧Q)D.P∨┓Q∨(P∧┓Q)∨(┓P∧┓Q)4.Linux下可執行文件的默認擴展名是( )。A. exe B. com C. dll D. 以上都不是5.如果在某個進制下等式7*7=41成立,那么在該進制下等式12*12=( )也成立。A. 100 B. 144 C. 164 D. 1966.提出“存儲程序”的計算機工作原理的是( )。A. 克勞德 香農 B. 戈登 摩爾 C. 查爾斯 巴比奇 D. 馮 諾依曼7.前綴表達式“+ 3 * 2 + 5 12 ” 的值是( )。A. 23 B. 25 C. 37 D. 658.主存儲器的存取速度比中央處理器(CPU)的工作速度慢的多,從而使得后者的效率受到影響。而根據局部性原理,CPU所訪問的存儲單元通常都趨于一個較小的連續區域中。于是,為了提高系統整體的執行效率,在CPU中引入了( )。A. 寄存器 B. 高速緩存 C. 閃存 D. 外存9.完全二叉樹的順序存儲方案,是指將完全二叉樹的結點從上到下、從左到右依次存放到一個順序結構的數組中。假定根結點存放在數組的1號位置上,則第k號結點的父結點如果存在的話,應當存放在數組中的( )號位置。A. 2k B. 2k+1 C. k/2下取整 D. (k+1)/210. 以下競賽活動中歷史最悠久的是( )。A. NOIP B. NOI C. IOI D. APIO二、不定項選擇題1.元素R1、R2、R3、R4、R5入棧的順序為R1、R2、R3、R4、R5。如果第1個出棧的是R3,那么第5個出棧的可能是( )。A. R1 B. R2 C.R4 D.R52. Pascal語言,C語言和C++語言都屬于( )。A. 高級語言 B. 自然語言 C. 解釋性語言 D. 編譯性語言3. 原地排序是指在排序過程中(除了存儲待排序元素以外的)輔助空間的大小與數據規模無關的排序算法。以下屬于原地排序的有( )。A. 冒泡排序 B. 插入排序 C. 基數排序 D. 選擇排序4. 在整數的補碼表示法中,以下說法正確的是( )。A.只有負整數的編碼最高位為1B.在編碼的位數確定后,所能表示的最小整數和最大整數的絕對值相同C.整數0只有一個唯一的編碼D.兩個用補碼表示的數相加時,如果在最高位產生進位,則表示運算溢出5. 一顆二叉樹的前序遍歷序列是ABCDEFG,后序遍歷序列是CBFEGDA,則根結點的左子樹的結點個數可能是( )。A.0 B. 2 C. 4 D. 66. 在下列HTML語句中,可以正確產生一個指向NOI官方網站的超鏈接的是( )。A.歡迎訪問NOI網站B.歡迎訪問NOI網站C.h t t p : / / w w w . n o i . c nD.歡迎訪問NOI網站7. 關于拓撲排序,下列說法正確的是( )。A.所有連通的有向圖都可以實現拓撲排序B.對同一個圖而言,拓撲排序的結構是唯一的C.拓撲排序中入度為0的結點總會排在入度大于0的結點的前面D.拓撲排序結果序列中的第一個結點一定是入度大于0的點8. 一個平面的法線是指與該平面垂直的直線。過點(1,1,1)、(0,3,0)、(2,0,0)的平面的法線是( )。A.過點(1,1,1)、(2,3,3)的直線B.過點(1,1,1)、(3,2,1)的直線C.過點(0,3,0)、(-3,1,1)的直線D.過點(2,0,0)、(5,2,1)的直線9.雙向鏈表中有兩個指針域llink和rlink,分別指向該結點的前驅及后繼。設p指向鏈表中的一個結點,他的左右結點均為非空。現要求刪除結點p,則下列語句序列中正確的是( )。A.p->rlink->llink=p->rlink; p->llink->rlink=p->llink; delete p;B.p->llink->rlink=p->rlink; p->rlink->llink = p->llink; delete p;C.p->rlink->llink = p->llink; p->rlink->llink ->rlink = p->rlink; delete p;D.p->llink->rlink = p->rlink; p->llink->rlink->link = p->llink; delete p;10. 今年(2010年)發生的事件有( )。A.惠普實驗室研究員Vinay Deolalikar 自稱證明了P≠NPB.英特爾公司收購計算機安全軟件公司邁克菲(McAfee)C.蘋果公司發布iPhone 4手機D.微軟公司發布Windows 7 操作系統三、問題求解1.LZW編碼是一種自適應詞典編碼。在編碼的過程中,開始時只有一部基礎構造元素的編碼詞典,如果在編碼的過程中遇到一個新的詞條,則該詞條及一個新的編碼會被追加到詞典中,并用于后繼信息的編碼。 舉例說明,考慮一個待編碼的信息串:“xyx yy yy xyx”。初始詞典只有3個條目,第一個為x,編碼為1;第二個為y,編碼為2;第三個為空格,編碼為3;于是串“xyx”的編碼為1-2-1(其中-為編碼分隔符),加上后面的一個空格就是1-2-1-3。但由于有了一個空格,我們就知道前面的“xyx”是一個單詞,而由于該單詞沒有在詞典中,我們就可以自適應的把這個詞條添加到詞典里,編碼為4,然后按照新的詞典對后繼信息進行編碼,以此類推。于是,最后得到編碼:1-2-1-3-2-2-3-5-3-4。 我們可以看到,信息被壓縮了。壓縮好的信息傳遞到接受方,接收方也只要根據基礎詞典就可以完成對該序列的完全恢復。解碼過程是編碼過程的逆操作。現在已知初始詞典的3個條目如上述,接收端收到的編碼信息為2-2-1-2-3-1-1-3-4-3-1-2-1-3-5-3-6,則解碼后的信息串是”____________”。2.無向圖G有7個頂點,若不存在由奇數條邊構成的簡單回路,則它至多有__________條邊。3.記T為一隊列,初始時為空,現有n個總和不超過32的正整數依次入列。如果無論這些數具體為何值,都能找到一種出隊的方式,使得存在某個時刻隊列T中的數之和恰好為9,那么n的最小值是___________。四、閱讀程序寫結果1.const size = 10;var i, j, cnt, n, m : integer; data : array[1..size] of integer;begin readln(n, m); for i := 1 to n do read(data[i]); for i := 1 to n do begin cnt := 0; for j := 1 to n do if (data[i] < data[j]) or ((data[j] = data[i]) and (j < i)) then inc(cnt); if cnt = m then writeln(data[i]); end;end.輸入5 296 -8 0 16 87輸出:__________2.const size = 100;var na, nb, i, j, k : integer; a, b : array[1..size] of integer;begin readln(na); for i := 1 to na do read(a[i]); readln(nb); for i := 1 to nb do read(b[i]); i := 1; j := 1; while (i <= na) and (j <= nb) do begin if a[i] <= b[j] then begin write(a[i],' '); inc(i); end else begin write(b[j], ' '); inc(j); end; end; if i <= na then for k := i to na do write(a[k], ' '); if j <= nb then for k := j to nb do write(b[k], ' ');end.輸入51 3 5 7 942 6 10 14輸出:__________3.const num = 5;var n: integer;function r(n : integer) : integer;var i : integer;begin if n <= num then begin r := n; exit; end; for i :=1 to num do if r(n-i) < 0 then begin r:=i; exit; end; r:=-1;end;begin readln(n); writeln(r(n));end.輸入 16輸出:__________4.const size=100;var n,m,x,y,i :integer; r: array[1.. size] of integer; map : array[1..size, 1..size] of boolean; found : boolean;function successful : boolean;var i : integer;begin for i :=1 to n do if not map[r[i]][r[i mod n + 1]] then begin successful := false; exit; end; successful :=true;end;procedure swap(var a, b : integer);var t : integer;begin t := a; a := b; b := t;end;procedure perm(left, right : integer);var i : integer;begin if found then exit; if left > right then begin if successful then begin for i := 1 to n do writeln(r[i], ' '); found := true; end; exit; end; for i:= left to right do begin swap(r[left], r[i]); perm(left + 1, right); swap(r[left], r[i]); end;end;begin readln(n, m); fillchar(map, sizeof(map), false); for i := 1 to m do begin readln(x, y); map[x][y] := true; map[y][x] := true; end; for i := 1 to n do r[i] := i; found := false; perm(1, n); if not found then writeln('No soloution');end.輸入:9 121 22 33 44 55 66 11 72 73 84 85 96 9輸出:__________五、完善程序1.(過河問題) 在一個月黑風高的夜晚,有一群人在河的右岸,想通過唯一的一根獨木橋走到河的左岸.在伸手不見五指的黑夜里,過橋時必須借照燈光來照明,不幸的是,他們只有一盞燈.另外,獨木橋上最多能承受兩個人同時經過,否則將會坍塌.每個人單獨過獨木橋都需要一定的時間,不同的人要的時間可能不同.兩個人一起過獨木橋時,由于只有一盞燈,所以需要的時間是較慢的那個人單獨過橋所花費的時間.現在輸入N(2<=N<1000)和這N個人單獨過橋需要的時間,請計算總共最少需要多少時間,他們才能全部到達河左岸. 例如,有3個人甲、乙、丙,他們單獨過橋的時間分別為1 2 4,則總共最少需要的時間為7.具體方法是:甲 乙一起過橋到河的左岸,甲單獨回到河的右岸將燈帶回,然后甲,丙在一起過橋到河的左岸,總時間為2+1+4=7.constSIZE = 100; INFINITY = 10000; LEFT = true; RIGHT = false; LEFT_TO_RIGHT = true; RIGHT_TO_LEFT = false;var n, i : integer; time : array[1..Size] of integer; pos :array[1..Size] of Boolean;function max(a, b :integer) : integer;beginif a > b then max := a else max := b;end;function go(stage : boolean) : integer;var i, j, num, tmp, ans : integer;begin if (stage = RIGHT_TO_LEFT) then begin num := 0; ans :=0; for i := 1 to n do if pos[i] = Rignt then begin inc(num); if time[i] > ans then ans := time[i];end;if __________ thenbegin go := ans; exit;end;ans := INFINITY;for i := 1 to n – 1 do if pos[i] = RIGHT then for j := i+1 to n do if pos[j] = RIGHT then begin pos[i] := LEFT; pos[j] := LEFT; tmp := max(time[i], time[j]) + _______; if tmp < ans then ans := tmp; pos[i] := RIGHT; pos[j] := RIGHT; end;go := ans;endelse if (stage = LEFT_TO_RIGHT)then begin ans := INFINITY; for i := 1 to n do if _______ then begin pos[i] := RIGHT; tmp := ________; if tmp < ans then ans := tmp; _________; end;go := ans; end else go := 0;end;begin readln(n); for i := 1 to n do begin read(time[i]); pos[i] := RIGHT; end;writeln(go(RIGHT_TO_LEFT));end.NOIP2010提高組(Pascal語言)參考答案與評分標準一、單項選擇題(共10題,每題1.5分,共計15分)1 2 3 4 5 6 7 8 9 10C A A D B D C B C B二、不定項選擇題(共10題,每題1.5分,共計15分,多選或少選均不得分)1 2 3 4 5 6 7 8 9 10ACD AD ABD AC B B D D BCD ABC三、問題求解(共3題,每題5分,共計15分)1.yyxy xx yyxy xyx xx xyx2.123.18四、閱讀程序寫結果(共4題,每題7分,共計28分)1.162.1 2 3 5 6 7 9 10 143.44.1 6 9 5 4 8 3 2 7五、完善程序(第1空2分,其余10空,每空2.5分,共計27分)(說明:以下各程序填空可能還有一些等價的寫法,各省可請本省專家審定和上機驗證,不一定上報科學委員會審查)1.① num <= 2(或num < 3 或num = 2)② go(LEFT_TO_RIGHT)③ pos[i] = LEFT(或LEFT = pos[i])④ time[i] + go(RIGHT_TO_LEFT)(或go(RIGHT_TO_LEFT) + time[i])⑤ pos[i] := LEFT本小題中,LEFT可用true代替,LEFT_TO_RIGHT可用true代替,RIGHT_TO_LEFT可用false代替。2.① opt[k]② home[r] := k③ j := i + i(或j := 2 * i 或j := i * 2)④ swap(i, j)(或swap(j, i))⑤ value[i] + heap[1](或heap[1] + value[i])⑥ i - m 展開更多...... 收起↑ 資源預覽 縮略圖、資源來源于二一教育資源庫