四、阅读程序写结果
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