第1题
[问题描述]
设有n个不同整数的数列:例如n二4时,有4个不同整数的数列为17,4,16,5。数列中的第1个数17,比它后面的三个数都大,则称数17的逆数为3。数列中的第2个数4比它后
面的数都小,则称数4的逆数为0。同时记数列中全部逆数的和称为数列的逆数。上例中,数列17,4,16,5的逆数为3+0+1+0=4
程序要求:当给出n个不同整数的数列后,求出此数列的逆数。
[算法说明]
为求得上面问题的解,设置数组a:anay[1..n] of integer和逆数计数器s,然后用一个二重循环求出数列的逆数。
[程序清单]
const n = 10;
var i, j, s: integer;
a: array[1..n] of integer;
begin
s:=0;
for i:= 1 to n do read(a[i]);
for i:= 1 to ___(1)___ do
for j:= ___(2)___ to n do
if a[i] > a[j] then ___(3)___
writeln('s:',s)
end.第2题
[问题描述]
装球:设有n个盒子(n足够大,可装入任何数量的球),分别编号1,2,…。同时有k个小球(k>0),今将k个小球装入到盒子中去。装入规则如下:
(1)第一个盒子不能为空。
(2)装入必须严格按递增顺序进行。
例如,当k:8,n;6时,装入方法有1,2,5或1,3,4。
(3)在满足上面的两个条件下,要求有球的盒子尽可能多。
(4)装完后,相邻盒子中球的个数差的绝对值之和最小(未装的盒子不计)。
如上例中
装入法1,2,5,则差的绝对值之和为2-1+5-2=4
装入法1,3,4,则差的绝对值之和为3-1+4-3=3
程序要求:给出k(k表示小球的个数)之后,求出满足上述四个条件的装入方法。
[算法说明]
设置数组a:anay[1..n] of integer;用数组元素代表盒子,然后依次装入小球。
[程序清单]
const n = 20;
var i, j, k, l:integer;
a: array[1..n] of integer;
begin
readln(k);
___(1)___;
j:=1;
while ___(2)___ do begin
a[j]:=j; ___(3)___ ;j:=j+1
end;
l:=j-1;
while k > 0 do begin
___(4)___ ;
k:=k-1;
l:=l-1;
end;
for I:= 1 to ___(5)___ do
write(a[I]:4)
end.第3题
[问题描述]
积木游戏:设有n个小木块排成一排,如下图:
口口口……
游戏开始时,每个小木块向下的一面涂有红、黄、蓝三种颜色之中的一种(约定:0表示红色,1表示黄色,2表示蓝色)。要求通过翻看与交换方式对小木块重新排列(翻看的规则为每
个小木块只能看一次),最终成为下面的形状:
口口口……口 口口口……口 口口口……
红 蓝 黄
即相同颜色的木块排列在一起,设计一个翻看与交换的方案,使得用最少的交换次数实现上面的要求。
[算法说明]
翻看小木块时,可以从两端进行。例如,设中间状态如下:
口口口……口 回口口……回 口口口……回 口口口……
红 a 未翻过 b 蓝 c 黄
此时,可以从两个方向看,即从a或b处开始:
1.若看a则有三种可能性:
为红色,则不用交换
为蓝色,交换一次,即a与b交换
为黄色,交换两次,即c与b交换一次,然后a与c再交换一次
此时,平均交换次数为1。
2.若看b,也有三种可能性:
为蓝色,则不用交换
为红色,交换一次,即b与a交换。
为黄色,交换一次,即b与c交换。
此时,平均交换次数为2/3。
由此可见,从b处翻看直到游戏结束,次数最少符合题目要求。
[程序清单]
const n=20;
var i, tem, r, b, y: integer;
a:array[1..n] of O..2;
begin
for i:=1 to n do read(a[i]);
r:=1; ___(1)___ ; y:=n;
while ___(2)___ do
if ___(3)___ then begin
tem:=a[r];a[r]:=a[b];a[b]:=tem;
r:=r+1
end
else if ___(4)___ then begin
tem:=a[b];a[b]:=a[y];a[y]:=tem;
___(5)___ ; ___(6)___ ;
end
else b:=b-1;
for i:=1 to n do write(a[i]:3)
end.第4题
[问题描述]
四色问题。设有下列形状的图形:有8个区域,其编号为1,2,…,n。(n=8)
图形中各区域的相邻关系用上边的邻接矩阵表示: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;
___(1)___ ; i:=2; j:=1;
while i<=n do
begin
while (j <= 4) and (i <= n) do
begin
k:=1;
while ___(2)___ do k:= k + 1;
if k < i then ___(3)___ else begin
___(4)___
i:=i+1; j:=1
end
end;
if j > 4 then begin i := i - 1; ___(5)___ end;
end;
for i:=1 to n do writeln(i,'---',s[i])
end.
第5题
[问题描述]
多项式加法运算:一个仅含有x的多项式可以用下列的方式表示:
(系数,指数),(系数,指数),…,(0,0)。其中(0,0)作为结束标志。
例如:P(x)=4x6-3x3+2x2-1可表示为:(4,6),(-3,3),(2,2),(-1,0),(0,0)
Q(x)=x4-x+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表示p,p2表示q,p3表示结果。处理的过程为将p赋值到p3,然后逐项检查q,当发现有相同的方次时,进行系数相加;当发现没有相同的方次时,插入到p3中去。
[程序清单]
var x, y, i, i1, j, j1, j2:integer;
p1, p2, p3: array [1..20, 1..2] of integer;
begin
i1:=0;
write('Input P(x)=');
read (x, y);
while x <> 0 do begin
j1:=j1+1; p1[j1,1]:=x;p1[j1,2]:=y;
read(x,y)
end;
j1:=j1+1; p1[j1,1]:=O; p1[j1, 2]:=O;
write ('Input Q (x) =');
read(x, y); j2:=0;
while x <> 0 do begin
j2:=j2+1; p2[j2,1]:=x; p2[j2,2]:=y;
read (x, y)
end;
j2:=j2+1; p2[j2,1]:=0; p2[j2,2]:=O;
for i:=1 to j1 do begin
p3[i,1]:=p1[i, 1];
p3[i,2]:=p1[i, 2]
end;
i:=1;
while ___(1)___ do begin
If ___(2)___ then begin
for j:=j1 down to 1 do begin
p3[j+1,1]:=p3[j,1];
p3[j+1,2]:=p3[j,2]
end;
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 ___(3)___ ;
if p2[i,2]=p3[i1,2] then
p3[i1,1]:= ___(4)___
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]; p3[i1,2]:=p3[I,2]; ___(5)___
end;
end;
i: =i+1;
end;
for j:=1 to j1-2 do write('(',p3[j,1],',',p3[j,2],'),');
writeln('(',p3[j+1,1],',',p3[j+1,2],')');
end.
|