NOIP2010(Pascal提高組)
壹、單項選擇題
1.與16進制數 A1.2等值的10進制數是 ( )A.101.2 B.111.4 C.161.125 D.177.25
2.壹個字節(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. 196
6.提出“存儲程序”的計算機工作原理的是( )。
A. 克勞德?香農 B.戈登?摩爾 C.查爾斯?巴比奇 D.馮?諾依曼
7.前綴表達式“+ 3 * 2 + 5 12 ” 的值是( )。A. 23 B. 25 C. 37 D. 65
8.主存儲器的存取速度比中央處理器(CPU)的工作速度慢的多,從而使得後者的效率受到影響。而根據局部性原理,CPU所訪問的存儲單元通常都趨於壹個較小的連續區域中。於是,為了提高系統整體的執行效率,在CPU中引入了( )。A.寄存器 B.高速緩存 C.閃存 D.外存
9.完全二叉樹的順序存儲方案,是指將完全二叉樹的結點從上到下、從左到右依次存放到壹個順序結構的數組中。假定根結點存放在數組的1號位置上,則第k號結點的父結點如果存在的話,應當存放在數組中的( )號位置。 A. 2k B. 2k+1 C. k/2下取整 D. (k+1)/2
10.以下競賽活動中歷史最悠久的是( )。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.R5
2. Pascal語言,C語言和C++語言都屬於( )。A.高級語言 B.自然語言 C.解釋性語言 D.編譯性語言
3. 原地排序是指在排序過程中(除了存儲待排序元素以外的)輔助空間的大小與數據規模無關的排序算法。以下屬於原地排序的有( )。A.冒泡排序 B.插入排序 C.基數排序 D.選擇排序
4. 在整數的補碼表示法中,以下說法正確的是( )。
A.只有負整數的編碼最高位為1 B.在編碼的位數確定後,所能表示的最小整數和最大整數的絕對值相同
C.整數0只有壹個唯壹的編碼 D.兩個用補碼表示的數相加時,若在最高位產生進位,則表示運算溢出
5. 壹顆二叉樹的前序遍歷序列是ABCDEFG,後序遍歷序列是CBFEGDA,則根結點的左子樹的結點個數可能是( )。 A.0 B. 2 C. 4 D. 6
6. 在下列HTML語句中,可以正確產生壹個指向NOI官方網站的超鏈接的是( )。
A.<a url=”h t t p : / / w w w . n o i . c n”>歡迎訪問NOI網站</a>
B.<a href=”h t t p : / / w w w . n o i . c n”>歡迎訪問NOI網站</a>
C.<a>h t t p : / / w w w . n o i . c n</a>
D.<a name”h t t p : / / w w w . n o i . c n”>歡迎訪問NOI網站</a>
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≠NP
B.英特爾公司收購計算機安全軟件公司邁克菲(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 2
96 -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.
輸入
5
1 3 5 7 9
4
2 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 12
1 2
2 3
3 4
4 5
5 6
6 1
1 7
2 7
3 8
4 8
5 9
6 9
輸出:__________
五、完善程序
1.(過河問題) 在壹個月黑風高的夜晚,有壹群人在河的右岸,想通過唯壹的壹根獨木橋走到河的左岸.在伸手不見五指的黑夜裏,過橋時必須借照燈光來照明,不幸的是,他們只有壹盞燈.另外,獨木橋上最多能承受兩個人同時經過,否則將會坍塌.每個人單獨過獨木橋都需要壹定的時間,不同的人要的時間可能不同.兩個人壹起過獨木橋時,由於只有壹盞燈,所以需要的時間是較慢的那個人單獨過橋所花費的時間.現在輸入N(2<=N<1000)和這N個人單獨過橋需要的時間,請計算總***最少需要多少時間,他們才能全部到達河左岸.
例如,有3個人甲、乙、丙,他們單獨過橋的時間分別為1 2 4,則總***最少需要的時間為7.具體方法是:甲 乙壹起過橋到河的左岸,甲單獨回到河的右岸將燈帶回,然後甲,丙在壹起過橋到河的左岸,總時間為2+1+4=7.
const
SIZE = 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;
begin
if 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 __________ then
begin
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;
end
else 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.
------------------------------------------------------------------------------
壹、單項選擇題(***10題,每題1.5分,***計15分)
1 2 3 4 5 6 7 8 9 10
C A A D B D C B C B
二、不定項選擇題(***10題,每題1.5分,***計15分,多選或少選均不得分)
1 2 3 4 5 6 7 8 9 10
ACD AD ABD AC B B D D BCD ABC
三、問題求解(***3題,每題5分,***計15分)
1.yyxy xx yyxy xyx xx xyx 2.12 3.18
四、閱讀程序寫結果(***4題,每題7分,***計28分)
1.16 2.1 2 3 5 6 7 9 10 14 3.4 4.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