您的当前位置:首页正文

96高初试题

2023-11-24 来源:步旅网



第二届全国青少年信息学(计算机)奥林匹克分区联赛初赛试题 (高中组)Pascal语言 竞赛用时:2小时
●●全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效●●一、基础知识部分(44分)
1.已知A盘上的目录和文件组织如下:

TP D11 F1.TXT TB F2.TXT DOS D31 F3.DOC F4.DOC FORMAT.COM
其中TPTBDOSD11D31都是子目录名。

设当前命令提示符为A:\TB>,请写出完成如下操作的DOS命令:
DOS运行中,没有执行过PATH命令,现要用DOS子目录中FORMAT命令,对插入在 B驱动器(5.25英寸高密)中的360KB软盘进行格式化工作,请写出相应的操作命令。

交换F2.TXTF3.DOC两个文件的内容,要求使用的命令不得超过三条;2.请用等号或不等号联接表示下列不同进位制数值的大小。

例如: (3)10 <(4)4 (100)2 <(A)16
其中圆括号外右下角的下标,表示圆括号内数的进位制。

(98.375)10 (142.3)8 (58.5)16 (1011000.0101)23.阅读程序,写出程序段运行后数组元素a1, a2 , ,a11 中的值。

a[1]:=1; a[2]:=1; k:=1;
repeat
a[k+2]:=1;
fori:=k1downto 2 do a[i]:=a[i]+a[i-1]; k:=k+1;
untilk>=10;
4.已知:ack(m,n)函数的计算公式如下:

ack (m , n) =

n+1

m=0

ack (m-1 , 1)

n=0

ack (m-1 , ack ( m , n-1) )

m0 n0

请计算:ack( 1 , 3 )ack( 2 , 4 )ack( 3 , 3 )ack( 3 , 4 ) 的值



5.有N×N个数据组成如下方阵:

A11 A12 A13…… A1N

A21 A22 A23…… A2N

A31 A32 A33…… A3N

…………

AN1 AN2 AN3…… ANN

并已知:AIJ=AJI
现将A11A12,…,A1NA22A23,…,A2NA33A34,…,A3N,…,ANN存储在一维数组A[1]A[2],…,A[N*(N+1) / 2 ]中。

试问:任给I, J 怎样求出K来,使得A[K]的值正好是AIJ,请写出由I, J计算K的表 达式。

6.已知:A1, A2, , A81共有81个数,其中只有一个数比其他数大,要用最少的比较运算次数,把这个值大的数找出来(假设两个数比较一次能决定出大于、小于或等于这

三种情况)请将以下算法补充完整。

第一步: s1=A1+A2+ + A27
s2=A28+A29+ + A54
第一次比较(s1 , s2 )
s1> s2 K= 0
s1< s2 K= 27
s1= s2 K= 54

第二步: s1=AK+1+AK+2+ + AK+9
s2=AK+10+AK+11+ + AK+18
第二次比较(s1 , s2 )

s1 > s2

K =

s1 < s2

K =

s1 = s2

K =

第三步: s1=AK+1+AK+2+ AK+3
s2=AK+4+AK+5+ AK+6
第三次比较(s1 , s2 )

s1 > s2

K =

s1 < s2

K =

s1 = s2

K =

第四步: s1=AK+1
s2=AK+2
第四次比较(s1 , s2 )

s1 > s2

为最大数

s1 < s2

为最大数

s1 = s2

为最大数





7

下面是一个利用完全二叉树特性,用顺序表来存储的一棵二叉树,结点数据为字符型(结

点层次号从小到大,同一层从左到右顺序存储,#表示空结点,@表示存储数据结束)。现

要求画出对应该存储结构的二叉树示意图。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15



A

B

C

#

#

D

E

#

#

#

#

#

G

F

@


二、根据题目要求,补充完善以下程序:

1[[ ]
积木游戏:设有n个小木块排成一排,如下图:

□□□ …………

游戏开始时,每个小木块向下的一面涂有红、黄、蓝三种颜色之中的一种(约定:0表示红色,1表示黄色,2表示蓝色)。要求通过翻看与交换方式对小木块重新排列(翻

看的规则为每个小木块只能看一次),最终成为下面的形状:

□□□ ……□ □□□ ……□ □□□ ……



即相同颜色的木块排列在一起,设计一个翻看与交换的方案,使得用最少的交换次

数实现上面的要求。

[算法描述]:翻看小木块时,可以从两端进行。例如,设中间状态如下:

a

b

c

□□□……□ □□……□ □□……□□□……









未翻过

此时,可以从两个方向看,即从ab处开始:
1.若看a则有三种可能性:
为红色,则不用交换
为蓝色,交换一次,即ab交换
为黄色,交换两次,即cb交换一次,然后ac再交换一次 此时,平均交换次数为1
2.若看b也有三种可能性:
为蓝色,则不用交换
为红色,交换一次,即ba交换
为黄色,交换一次,即bc交换
此时,平均交换次数为2/3
由此可见,从b处翻看直到游戏结束,次数最少符合题目要求。

[ ] program exp1 (input , output);

const n = 20;
var i , tem , r , b , y : integer;



a: array [ 1 . . n ] of 0 . . 2;

begin

for i := 1 to n do read (a[ i ]);

r := 1;

; y := n;




while do

if

then begin



tem:= a[ r ]; a[ r ]:= a[ b ]; a[ b ] := tem; r := r + 1

end

else if

then begin



tem := a[ b ];

a[ b ] := a[ y ];

a[ y ]:= tem;



end

;

;





else b := b - 1;
for i := 1 to n do write ( a[ i ] : 3 )
end.

2[ ]

四色问题。设有下列形状的图形:有8 个区域,其编号为12,…,n。(n = 8

8

7

2

6

3

5

4




1

2

3

4

5

6

7

8


1
2
3
4
5
6
7
8


0

1

0

0

0

0

1

1

1

0

1

0

0

1

1

0

0

1

0

1

0

1

0

0

0

0

1

0

1

1

0

0

0

0

0

1

0

1

0

0

0

1

1

1

1

0

1

0

1

1

0

0

0

1

0

1

1

0

0

0

0

0

1

0



1

图形中各区域的相邻关系用上边的邻接矩阵表示:1——相邻,0——不相邻。

[程序要求]:将上面图形的每一个部分涂上红(1),黄(2),蓝(3),绿(4)四种颜色之一,要 求相邻的部分不同色。

[算法描述]:用数组 r : array [ 1 .. n , 1 .. n ] of 0 .. 1 ; 表示邻接矩阵

s : array [ 1 .. n ] of integer ; 表示涂的元素。

采用回溯的方法,首先给第一个图形涂上红色(1),然后在下面的图形中依次涂上其它颜色,当有矛盾时回溯解决。

[ ]
const n = 8;
var i , j , k : integer;
r : array [ 1 .. n , 1 .. n ] of 0 .. 1;
s : array [ 1 .. n ] of integer;



begin
for i := 1 to n do begin
for j:=1 to n do read ( r [ i , j ]); readln; end;

;

i := 2;

j := 1;

while i < = n do begin
while ( j < =4 ) and (i < = n) do begin
k:= 1;
while do k := k + 1;
if k < i then
else begin
④ ; i:= i + 1; j := 1; end;
end;
if j > 4 then begin

i := i - 1;

end;
end;
for i := 1 to n do writeln ( i , ‘’, s[ i ]) end.

3[ ]

多项式加法运算:一个仅含有x的多项式可以用下列的方式表示:

(系数,指数)(系数,指数),……,(00)。其中(0, 0) 作为结束标志。

例如:P( x ) = 4x6–3x3+ 2x21可表示为:(4, 6)(-3, 3)(2, 2)(-1, 0)(0, 0)

Q( x ) = x4x+1 可表示为:(1, 4)(-1, 1)(1, 0)(0, 0)

当用上面的方式给出2个多项式之后,程序对这两个多项式进行加法运算,结果也用上面的方式给出。

例如:上面的P(x ) Q( x ) 相加的结果为: 4x6+x4–3x3+ 2x2–x

表示结果为:(4, 6)(1, 4)(-3, 3)(2, 2)(-1, 1)(0, 0)

[算法描述]:多项式可用数组p: array [ 1 .. n , 1 .. 2 ] of integer 表示。

分别以p1表示pp2表示qp3表示结果。处理的过程为将p赋值到p3,然后逐项检查q,当发现有相同的方次时,进行系数相加;当发现没有相同方次时,插入到p3中去。

[ ]

var x , y , i , i1 , j , j1 , j2 : integer;
p1, p2 , p3 : array [ 1 .. 20 , 1 .. 2 ] of integer; begin



j1:= 0;

write ( ‘ Input P (x) =’);

read ( x , y );

while (x <>0) or (y<>0) do begin

j1:= j1+1;

p1 [ j1, 1 ]:= x;

p1 [ j1, 2 ]:= y; read ( x , y ) ;

end;
j1:=j1+1; p1[j1 , 1 ]:= 0; p1[j1 , 2 ] := 0; write (‘ Input Q ( x ) = ’ ); read(x , y); j2 := 0;
while (x <>0) or (y<>0) do begin

j2 := j2+1; p2[ j2 , 1 ] :=x; end;

p2[j2 , 2 ]:= y; read (x , y);

j2 := j2+1;

p2[ j2 , 1 ] := 0;

p2[ j2 , 2 ]:= 0;

for i := 1 to j1 do begin



p3[ i , 1 ] := p1[ i , 1 ]; end;
i := 1;

p3[i , 2 ] := p1[ i , 2 ]

while

do begin

if

then begin




for j := j1 downto 1 do begin



end

p3[ j+1 , 1 ] := p3 [ j , 1 ]; p3[ j+1 , 2 ] := p3 [ j , 2 ]

p3 [ i , 1]:= p2[ i , 1];

p3[ i , 2 ]:= p2[ i , 2 ];

j1:= j1+1

end
else begin
i1:=1;



while p2[ i , 2 ] < p3[ i1 , 2 ] do if p2[ i , 2 ] = p3[ i1 , 2 ] then

p3[ i1 , 2 ] :=

else begin

;





for j := j1 downto i1 do begin
p3[ j+1 , 1 ]:= p3[ j , 1 ]; p3[ j+1 , 2 ]:= p3[ j , 2 ] end;

p3[ i1 , 1 ]:= p[ i , 1 ]; ;
end;
end; {if}
i := i + 1;
end; {while}

p3[i1 , 2 ]:= p3[ i , 2 ];

for j := 1 to j1-2 do write ( ‘ ( ’ , p3[ j , 1 ] , ‘ , ’ , p3[ j , 2 ] , ‘ ) ,’ ); writeln ( ‘ ( ’ , p3[ j+1 , 1 ], ‘ , ’ , p3[ j+1 , 2 ], ‘ )’ );
end.

因篇幅问题不能全部显示,请点此查看更多更全内容