1999年—2024年信息学奥赛提高组初赛试题PASCAL(附答案,完整)(3)

2025-07-28

四、阅读程序写结果

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]);

13

江苏省新海高级中学

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

14

江苏省新海高级中学

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;

15

江苏省新海高级中学

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

16

江苏省新海高级中学

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;

17

江苏省新海高级中学

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;

18

江苏省新海高级中学

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.

2.(烽火传递)烽火台又称烽燧,是重要的军事防御设施,一般建在险要处或交通要道上。一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息;夜晚燃烧干柴,以火光传递军情。在某两座城市之间有n个烽火台,每个烽火台发出信号都有一定的代价。为了使情报准确地

传递,在连续m个烽火台中至少要有一个发出信号。现输入n、m和每个烽火台发出信号的代价,请计算总共最少花费多少代价,才能使敌军来袭之时,情报能在这两座城市之间准确传递。

例如,有5个烽火台,它们发出信号的代价依次为1、2、5、6、2,且m为3,则总

共最少花费的代价为4,即由第2个和第5个烽火台发出信号。

const

SIZE= 100;

var

n. m, r, i : integer;

value, heap, pos, home, opt : array[l..SIZEl of integer;

//heap [i]表示用顺序数组存储的堆heap中第i个元素的值

//pos [i]表示opt [i]在堆heap中的位置,即heap lpos [i]] =opt [i]

19

江苏省新海高级中学

//home [i]表示heap [i]在序列opt中的位置,即opt [home [i]] =heap [i]

procedure swap (i, j : integer)j

//交换堆中的第i个和第j个元素

var

tmp : integer;

begin

pos [home [i]] :=j;

pos [home[j]] :=i;

tmp :=heap [i];

heap [i] :=heap [j];

heap [j] :=tmp;

tmp :=home [i];

home [i] :=home[j];

home [j] := tmp;

end;

procedure add (k : integer) ;

//在堆中插入opt[k]

var

i : integer;

begin

inc (r) ;

heap [r] := ①

pos [k] := r;

while (i > 1) and (heap[i] < heap[i p _2]) do

begin

swap (i, i p 2);

i := i p 2;

end;

end;

procedure remove (k : integer) ;

//在堆中删除opt[k]

var

i, j : integer;

begin

i := pos [k] ;

swap (i, r) ;

dec (r) ;

if i = r + 1 then

exit;

20

江苏省新海高级中学

while (i > 1) and (heap [i] < heap[i p 2]) do

begin

swap (i, i p 2);

i := i p 2;

end;

while i + i <= r do

begin

if (i + i + 1 <= r) and (heap[i + i + 1] < heap[i + i]) then

j:=i+i+l

else


1999年—2024年信息学奥赛提高组初赛试题PASCAL(附答案,完整)(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:【解析版】贵州省六校联盟2024届高三第二次联考 英语试题

相关阅读
本类排行
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 7

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219