主题:求大量有关noip初赛的的试题,不要历届试题,感激不尽!
chip
[专家分:80] 发布于 2010-08-14 22:09:00
本人收了个徒弟,不成器啊,这不,初赛快来了,得先帮她过了初赛啊,急求大量有关‘阅读程序写结果’,‘完善程序’的试题,但不要历届试题(我全有!),像模拟题(有点嚼劲的最好),自编题,或自己积累的。望各方路人兄弟姐妹生出援助之手,感激不尽啊!
有事联系,我qq:1554487236
再次感谢
[em3]
回复列表 (共14个回复)
沙发
chip [专家分:80] 发布于 2010-08-25 16:43:00
大家踊跃点啥,感激不尽啊!
板凳
pascal编游戏 [专家分:300] 发布于 2010-08-25 18:38:00
由于是Word文档,回帖没法添加附件,就给你贴上来吧:
第一份:
四.阅读程序 (前三题每题6分,第四题7分,共25分)
1、
var
p,q,s,t:integer;
begin
readln(p);
for q:=p+1 to 2*p do
begin
t:=0;s:=(p*q)mod(q-p);
if s=0 then begin
t:=p+q+(p*q)div(q-p)
write(t:4)
end;
end;
end.
输入12
输出:
2、Var d1,d2,X,Min:real;
begin
min:=10000;X:=3;
while X<15 do
begin
d1:=sqrt(9+(X-3)*(X-3));d2:=sqrt(36+(15-X)*(15-X));
if(d1+d2)<Min then Min:=d1+d2;
X:=x+0.001;
end;
writeln(Min:O:2);
end.
输出:
3、
function ack(m,n:integer):integer;
begin
if m=0 then ack:=n+1
else if n=0 then ack:=ack(m-1,1)
else ack:=ack(m-1,ack(m,n-1))
end;
begin
writeln(ack(3,3));
readln;
end.
输出:
4、const
u: array[0..2] of integer = (1, -3, 2);
v: array[0..1] of integer = (-2, 3);
var
i, n, sum: integer;
function g(n: integer): integer;
var i, sum: integer;
begin
sum := 0;
for i := 1 to n do inc(sum, u[i mod 3] * i);
g := sum;
end;
begin
sum := 0;
read(n);
for i := 1 to n do inc(sum, v[i mod 2] * g(i));
writeln(sum);
end.
输入:103
输出:
五.完善程序 (前10空,每空2分,后5空,每空3分,共35分)
1、问题描述:工厂在每天的生产中,需要一定数量的零件,同时也可以知道每天生产一个零件的生产单价。在N天的生产中,当天生产的零件可以满足当天的需要,若当天用不完,可以放到下一天去使用,但要收取每个零件的保管费,不同的天收取的费用也不相同。
问题求解:求得一个N天的生产计划(即N天中每天应生产零件个数),使总的费用最少。
输入:N(天数N<=29)
每天的需求量(N个整数)
每天生产零件的单价(N个整数)
每天保管零件的单价(N个整数)
输出:每天的生产零件个数(N个整数)
例如:当N=3时,其需要量与费用如下:
第一天 第二天 第三天
需要量 25 15 30
生产单价 20 30 32
保管单价 5 l0 0
生产计划的安排可以有许多方案,如下面的三种:
第一天 第二天 第三天 总的费用
25 15 30 25*2O+15*30+30*32=1910
40 0 30 40*20+15*5+30*32=1835
70 0 0 70*20+45*5+30*10=1925
程序说明:
b[n]:存放每天的需求量
c[n]:每天生产零件的单价
d[n]:每天保管零件的单价
e[n]:生产计划
程序:
Program exp5;
Var
i,j,n,yu,j0,j1,s:integer;
b,c,d,e: array[0..30]of integer;
begin
readln(n);
for i:=1 to n do readln(b[i],c[i],d[i]);
for i:=1 to n do e[i]:=0;
① :=10000;c[n+2]:=0;b[n+1]:=0;jO:=1;
while (jO<=n)do
begin
yu:=c[j0]; j1:=jO; s:=b[j0];
while ② do
begin
③ j1:=j1+1;s:=s+b[j1];
end;
④ jO:=j1+1;
end;
for i:=1 to n do ⑤
readln;
end.
2、问题描述:有n种基本物质(n≤10),分别记为P1,P2,……,Pn,用n种基本物质构造一种物品,物品使用在k个不同地区(k≤20),每个地区对物品提出自己的要求,这些要求用一个n位的数表示:α1α2……αn,其中:
αi =1表示必须有第i种基本物质
=-1表示必须不能有第i种基本物质
=0无所谓
问题求解:当k个不同地区要求给出之后,给出一种方案,指出哪些物质被使用,哪些物质不被使用。
程序说明:数组b[1],b[2],...,b[n]表示某种物质是否需要
a[1..k,1..n]记录k个地区对物质的要求,其中:
a[I,j]=1表示第i个地区对第j种物质是需要的
a[i,j]=0表示第i个地区对第j种物质是无所谓的
a[i,j]=-1表示第i个地区对第j种物质是不需要的
程序:
program gxp2;
Var i, j ,k, n :integer;
p:boolean;
b :array [0..20] of 0..1;
a :array[1..20,1..10] of integer;
begin
readln(n,k);
for i:=1 to k do
begin
for j:=1 to n do read(a[i,j]);
readln;
end;
for i:=O to n do b[i]:=0;
p:=true;
while ① do
begin
j:=n;
while b[j]=1 do j:=j-1;
②
③
for i:=j+1 to n do b[i]:=0;
for i:=1 to k do
for j:=1 to n do
if( a[i,j]=1 ) and (b[j]=0) or ④
then p:=true;
end;
if ⑤
then writeln('找不到!‘)
else for i:=1 to n do
if (b[i]=1) then writeln('物质',i,’需要')
else writeln('物质',i,'不需要');
end.
3、Joseph
题目描述:
原始的Joseph问题的描述如下:有n个人围坐在一个圆桌周围,把这n个人依次编号为1,…,n。从编号是1的人开始报数,数到第m个人出列,然后从出列的下一个人重新开始报数,数到第m个人又出列,…,如此反复直到所有的人全部出列为止。比如当n=6,m=5的时候,出列的顺序依次是5,4,6,2,3,1。
现在的问题是:假设有k个好人和k个坏人。好人的编号的1到k,坏人的编号是k+1到2k。我们希望求出m的最小值,使得最先出列的k个人都是坏人。
输入:
仅有的一个数字是k(0 < k <14)。
输出:
使得最先出列的k个人都是坏人的m的最小值。
输入样例:
4
输出样例:
30
程序:
var
i, k, m, start: longint;
find: boolean;
function check(remain: integer): boolean;
var result: integer;
begin
result:=( ① ) mod remain;
if( ② )then begin
start := result; check := true;
end
else check := false;
end;
begin
find := false;
read(k);
m := k;
while ( ③ ) do begin
find := true; start := 0;
for i := 0 to k-1 do
if( not check( ④ )) then begin
find := false; break;
end;
inc(m);
end;
writeln( ⑤ );
end.
3 楼
pascal编游戏 [专家分:300] 发布于 2010-08-25 18:40:00
第二份:
三.阅读程序 (前三题每题6分,第四题7分,共25分)
1、var
u: array [0..3] of integer;
a, b, c, x, y, z: integer;
begin
read(u[0], u[1], u[2], u[3]);
a := u[0] + u[1] + u[2] + u[3] - 5;
b := u[0] * (u[1] - u[2] div u[3] + 8);
c := u[0] * u[1] div u[2] * u[3];
x := (a + b + 2) * 3 - u[(c + 3) mod 4];
y := (c * 100 - 13) div a div (u[b mod 3] * 5);
if((x+y) mod 2 = 0) then z := (a + b + c + x + y) div 2;
z := (a + b + c – x - y) * 2;
writeln(x + y - z);
end
输入:2 5 7 4
输出:
2、var
x,y1,y2,y3:integer;
begin
readln(x);
y1:=0;y2:=-1;ye:=1;
while y2<=x do
begin
y1:=y1+1;
y3:=y3+2;
y2:=y2+y3;
end;
writeln(y1);
end.
输入:23420
输出:
3、VAR I,J,H,M,N,K:INTEGER;
B :ARRAY[1..10]OF INTEGER;
BEGIN
READLN(N);
FOR I:=1 TO 10 DO
BEGIN
M:=N;J:=11;
WHILE M>0 DO
BEGIN J:=J-1;B[J]:=M MOD 10;M:=M DIV 10 END;
FOR H:=J TO 10 DO N:=N+B[H];
END;
WRITELN(N);
END.
输入1234
输出:
4、var
a : array [1..50] of integer;
n, i, sum : integer;
procedure work(p, r: integer);
var
i, j, temp : integer;
begin
if p < r then begin
i := p - 1;
for j := p to r - 1 do
if a[j] >= a[r] then begin
inc(i);
temp := a[i]; a[i] := a[j]; a[j] := temp;
end;
temp := a[i + 1]; a[i + 1] := a[r]; a[r] := temp;
work(p, i);
work(i + 2, r);
end;
end;
begin
read(n);
for i := 1 to n do read(a[i]);
work(1, n);
for i := 1 to n - 1 do sum := sum + abs(a[i + 1] - a[i]);
writeln(sum);
end.
输入:10 23 435 12 345 3123 43 456 12 32 -100
输出:
还没完…………
这一份太长了,分成两张帖。
4 楼
pascal编游戏 [专家分:300] 发布于 2010-08-25 18:41:00
四.完善程序 (前10空,每空2分,后5空,每空3分,共35分)
1、存储空间的回收算法。设在内存中已经存放了若干个作业A,B,C,D。其余的空间为可用的(如图一中(a))。
此时,可用空间可用一个二维数组dk[1..100,1..2 ]表示,(如下表一中(a)),其中:dk[i,1]对应第i个可用空间首址,dk[i,2]对应第i个可用空间长度如上图中,dk:
100 50
300 100
500 100
0 0
100 50
300 100
500 100
10000 0
表一(a) 表一(b)
现某个作业释放一个区域,其首址为d,长度为L,此时将释放区域加入到可用空间表中。要求在加入时,若可用空间相邻时,则必须进行合并。因此出现下面的4种情况:
(1)下靠,即回收区域和下面可用空间相邻,例如,d=80,L=20,此时成为表二中的(a)。
(2)上靠,例如,d=600,L=50,此时表成为表二中的(b)。
(3)上、下靠,例如,d=150,L=150,此时表成为表二中的(c)。
(4)上、下不靠,例如,d=430,L=20,此时表成为表二中的(d)。
80 70
300 100
50 100
100 50
300 100
500 150
100 300
500 100
100 50
300 100
430 20
500 100
表二(a)(下靠) 表二(b)(上靠) 表二(c)(上,下靠) 表二(d)(上,下不靠)
程序说明:对数组dk预置2个标志,即头和尾标志,成为表一中(b),这样可使算法简单,sp为dk表末地址。
程序清单:
VAR I,J,SP,D,L:INTEGER;
DK :ARRAY[0..100,1..2]OF INTEGER;
BEGIN
READLN(SP);
FOR I:=1 TO SP DO
READLN(DK[I,1],DK[I,2]);
DK[0,1]:=0;DK[0,2]:=0; ① ;
DK[SP,1]:=10000;DK[SP,2]:=0;READLN(D,L);I:=1;
WHILE DK[I,1]<D DO I:=I+1; ② ;
IF(DK[I,1]+DK[I,2]=D)THEN
IF(D+L=DK[I+1,1])THEN
BEGIN
DK[I,2]:= ③ ;
FOR J:=I+1 TO SP-1 DO
DK[J]:=DK[J+1];
SP:=SP-1;
END
ELSE DK[I,2]:=DK[I,2]+L
ELSE IF(D+L=DK[I+1,1])THEN
BEGIN
DK[I+1,1]:= ④ ;DK[I+1,2]:=DK[I+1,2]+L
END
ELSE BEGIN
FOR J:=SP DOWNTO I+1 DO DK[J+1]:=DK[J];
⑤ :=D; DK[I+1,2]:=L;SP:=SP+1;
END;
FOR I:=1 TO SP-1 DO WRITELN(DK[I,1]:4,DK[I,2]:4);
END.
2、求出一棵树的深度和宽度。例如有如下的一棵树:
其树的深度为从根结点开始到叶结点结束的最大深度,树的宽度为同一层上结点数的最大值。在上图中树的深度为4,宽度为3。
用邻接表来表示树,上图中的树的邻接表示如下:
1 2 3 4 0 0
2 0 0 0 0 0
3 5 0 0 0 0
4 6 0 0 0 0
5 0 0 0 0 0
6 7 0 0 0 0
7 0 0 0 0 0
程序
VAR
I,J,SP1,SP2,L,MAX:INTEGER;
TREE:ARRAY[1..20,1..6] OF INTEGER;
Q:ARRAY[1..100,0..6] OF INTEGER;
D:ARRAY[0..20] OF INTEGER;
BEGIN
FOR I:=1 TO 14 DO FOR J:=1 TO 6 DO TREE[I,J]:=O;
FOR J:=1 TO 14 DO TREE[J,1]:=J;
TREE[1,2]:=2; TREE [1,3]:=3; TREE[1,4]:=4; TREE[2,2]:=5;
TREE[2,3]:=6; TREE [3,2]:=7; TREE[3,3]:=8; TREE[4,2]:=9;
TREE[4,3]:=10; TREE[4,4]:=11; TREE[7,2]:=12;
TREE[7,3]:=13; TREE[13,2]:=14;
SP1:=1; SP2:=1;
FOR I:=1 TO 6 DO Q[1,I]:=TREE[1,I];
Q[1,0]:=1;
WHILE( ① ) DO BEGIN
L:=( ② ); J:=2;
WHILE( ③ )DO
BEGIN
SP2:=SP2+1;Q[SP2,0]:=L;Q[SP2,1]:=Q[SP1,J];
FOR I:=2 TO 6 DO
Q[SP2,I]:=TREE[Q[SP1,J],I];
J:=J+1
END;
SP1:=SP1+1
END;
WRITELN( ④ );
FOR I:=0 TO 20 DO D[I]:=0;
FOR I:=1 TO SP2 DO
D[Q[I,0]]:=( ⑤ );
MAX:=D[1];
FOR I:=2 TO 20 DO
IF D[I]>MAX THEN MAX:=D[I];
WRITELN(MAX);
READLN;
END.
天哪,两张帖都不够,得第三张。
5 楼
pascal编游戏 [专家分:300] 发布于 2010-08-25 18:41:00
3、OIM地形
题目描述:
二维离散世界有一种地形叫OIM(OI Mountain)。这种山的坡度只能上升('/')或下降('\'),而且两边的山脚都与地平线等高,山上所有地方都不低于地平线.例如:
/\ /\
/ \/\ 是一座OIM;而 / \ 不是。
\/
这个世界的地理学家们为了方便纪录,给OIM所有可能的形状用正整数编好号,而且每个正整数恰好对应一种山形。他们规定,若两座山的宽度不同,则较宽的编号较大;若宽度相同,则比较从左边开始第1个坡度不同的地方,坡度上升的编号较大。以下三座OIM的编号有小到大递增:
/\ /\ /\ /\
/ \/\ / \/\/\ / \/ \。显然/\的编号为1。但是地理学家在整理纪录是发觉,查找编号与山形的对应关系不是很方便。他们希望能快速地从编号得到山的形状。你自告奋勇答应他们写一个程序,输入编号,能马上输出山形。
输 入:一个编号(编号大小不超过600,000,000),
输 出:输入编号所对应的山形,1座山所占行数恰为它的高度,即山顶上不能有多余空行。
输入样例:15
输出样例: /\ /\
/ \/ \
程 序:
program Program2;
const
L:integer =19; SZ: integer =50;
UP: char = '/'; DN: char = '\';
Var
i,nth,x,y,h,e,f:integer;
m: array[0..1,0..38,0..19] of integer;
pic: array[0..49,0..49] of char;
procedure init;
var k,s,a,b,c: integer;
begin
for a:=0 to 1 do
for b:=0 to 2*L do
for c:=0 to L do
m[a,b,c]:=0; m[0,0,0]:=1;
for k:=0 to 2*L-1 do
begin
for s:=1 to L do
begin
m[0,k+1,s] := m[0,k,s+1] + m[1,k,s+1];
m[1,k+1,s]:= (1) ;
end;
m[0,k+1,0] :=m[0,k,1]+m[1,k,1];
end;
end;
procedure draw(k,s,nth:integer);
begin
if (k=0) then exit;
if ((nth-m[1,k,s])>=0) then
begin
nth:=nth-m[1,k,s];
if (y>h) then (2) ;
pic[y,x]:=UP; y:=y+1; x:=x+1; draw( (3) );
end
else begin
y:=y - 1; pic[y,x]:=DN; x:=x+1; draw(k-1,s-1,nth);
end;
end;
begin
init;
read(nth);
for e:=0 to SZ-1 do
for f:=0 to SZ-1 do
pic[e,f]:= ' ';
x:=0;
y:=0
h:=0;
i:=0;
while ((nth-m[0,2*i,0])>=0) do
begin
nth:= nth-m[0,2*i,0];
(4) ;
end;
draw( (5) );
for i:=h downto x-1 do
begin
for e:=0 to x-1 do
write(pic[i,e]);
writeln(' ');
end.
6 楼
pascal编游戏 [专家分:300] 发布于 2010-08-25 18:42:00
第三份:
四、阅读程序题(8’*4=32’)
1.program cs05ml_read_program_1;
var a,b,c,d,e:integer;
begin
a:=1; b:=a+2; c:=b+3; d:=c+4; a:=d+5;
for e:=1 to 4 do
begin
if a mod 2=0 then a:=a div 2+d
else a:=a div 2+d+1;
b:=a+2; c:=b+3; d:=c+4; a:=d+5;
end;
writeln(a);
end.
2.program cs05ml_read_program_2;
var m,i,j:integer;
a:array[1..100] of longint;
n:longint;
begin
readln(m);
for i:=1 to m do
begin
a:=1;
for j:=i-1 downto 2 do a[j]:=a[j]+a[j-1];
end;
for i:=1 to m do n:=n+a;
writeln(n);
end.
输入:11 输出:
3.program cs05ml_read3;
var a,m,n,i,j,c:integer;
b:array[1..16] of 0..1;
begin
readln(a,m,n);
i:=0;
while m>0 do begin b:=m mod 2; m:=m div 2; i:=i+1; end;
c:=1;
for j:=i-1 downto 0 do
begin c:=c*c mod n; if b[j]=1 then c:=a*c mod n; end;
writeln(c);
end.
输入:10 100 900
输出:
4.program cs05ml_read_program_4;
const max=10;
var w:array[1..max] of integer;
i,n,m,weight:integer;
begin
readln(weight); write(weight,'=');
m:=1; i:=1; w:=1;
while m<weight do
begin i:=i+1; w:=w[i-1]*3; m:=m+w; end;
n:=weight+m; i:=1;
while n>0 do
begin
case n mod 3 of
0:write('-',w);
2:if i>1 then write('+',w);
end;
n:=n div 3; i:=i+1;
end;
end.
输入:50 输出:
五、完成程序题(28’)
1.奇数幻方 (3*5’=15’)
对于输入的奇数m,将1到m*m这些自然数填入m行m列格子中,使每行、每列及对角线的和相等。输出一种填法及这个相等的和。
下面的程序中限制m为不超过15的奇数,当输入0时结束程序。如输入3时,程序输出:
8 1 6
3 5 7
4 9 2
15
[程序]:
program 2005ML_5_1;
const max=15;
var a:array[1..max,1..max] of integer;
m:integer;
procedure GetAnOddNumberOrZero;
begin
repeat
write('Enter an odd number,no more than ',max,' (0 to stop)');
readln(m);
until _________________(1)______________;
end;
procedure ArrangeMagicMatrix(M:integer);
var row,col,num:integer;
begin
row:=1;col:=_________________(2)______;
a[row,col]:=1;
for num:=2 to m*m do
begin
if (num-1) mod m=0 then row:=row+1
else
begin
if row=1 then row:=m else__________(3)________;
if col=m then col:=1 else _________(4)_________;
end;
______________________(5)________;
end;
end;
procedure Print(m:integer);
var row,col:integer;
begin
for row:=1 to m do begin for col:=1 to m do write(a[row,col]:5); writeln; end;
writeln('Sum=',m*(m*m+1) div 2:5);writeln
end;
begin
repeat
GetAnOddNumberOrZero;
if m<>0 then begin ArrangeMagicMatrix(m); print(m); end;
until m=0;
end
2、简单的背包问题 (2’+4’+4’+3’)
有n种物品的体积分别为s[1]、s[2]、…、s[n],价值分别为p[1]、p[2]、…、p[n],现有一只容量为C的背包,在不超过背包总容量的情况下,如何在n种物品中选择若干种装入背包,使所装物品的总价值最大?
程序要求先输入n和c,然后输入n种物品的体积和价值,最后输出最大的总价值。
[程序]:
program cs05ml_5_2;
const maxn=50; maxv=1000;
var s,p:array[1..maxn] of integer;
v:array[0..maxn,0..maxv] of integer;
i,j,n,c:integer;
function max(x,y:integer):integer;
begin if x<y then max:=y else max:=x; end;
begin
readln(_________(1)___);
for i:=1 to n do readln(s,p);
for i:=0 to n do v[i,0]:=0;
for i:=0 to c do v[0,i]:=0;
for i:=1 to n do
for j:=1 to c do
begin
v[i,j]:=___________(2)__________;
if s<=j then v[i,j]:=______________________________________(3)____;
end;
writeln(_________(4)____);
end.
7 楼
pascal编游戏 [专家分:300] 发布于 2010-08-25 18:43:00
第四份:
三.阅读程序写出正确的程序运行结果(4 *8分=32分)
1 program t1;
var n,k,s:longint;
begin
readln(n);
k:=0;
s:=1;
while s <= n do
begin
k:=k+1;
n:=n-s;
s:=s+6*k
end;
writeln (k)
end.
输入:1000000
输出:
2. program t2;
var x,y1,y2,y3:integer;
begin
readln(x);
y1:=0;y2:=1;y3:=1;
while y2<=x do
begin
y1:=y1+1;y3:=y3+2;y2:=y2+y3;
end;
writeln(y1);
end.
输人:x=400
输出:
3. program t3;
var m,n,i,j:integer;
p,w,a,b:array[0..19] of integer;
begin
read(n); m:= 0;
for i:= 0 to n-1 do
begin read (p[i]); b[i] :=1; end;
for i := 0 to n-1 do
begin
if (i>0) then
a[m]:= p[i]-p[i-1]
else
a[m]:= p[i];
m:= m+1:
while ((m>1) and (a[rn-1]=0)) do
begin m ;= m-1; b[m] := l; end;
if (m>0) then
w[i]:=b[m-1]
else
w[i]:=b[0];
a[m-1] := a[m-1]-1;
for j := 0 to m-1 do b[j] ;= b[j]+1;
while ((m>1) and (a[m-1]=0)) do
begin
m := m-1; b[m] :=1;
end;
end;
for i := 0 to n-1 do
begin
write(w[i]); write(' ');
end;
writeln(' ');
end.
输入:4
4 6 6 6
输出:
4. program t4;
const
u:array[1..4] of integer = (0,5,3,1);
v:array[1..4] 0f integer = (0,7,6,5);
var a,b,c,d,e,f,x,y,z: integer;
begin
read (a,b,c,d,e,f);
z := f + e + d + (c+3) div 4; y := 5 * d + u [ c mod 4 ];
if (b>y) then
begin
z := z+ (b-y+8) div 9;
x := ((b-y+8) div 9 * 9- (b-y)) * 4+11*e+V[c mod 4];
end
else
x := (y-b) *4+11*e+v[c mod 4];
if (a>x) then
z := z + (a-x+35) div 36;
writeln(z);
end.
输入: 4 7 9 20 56 47
输出:
四.完善程序题(2分+3*4分+2分+4*3分=28分)
1.问题描述:工厂在每天的生产中,需要一定数量的零件,同时也可以知道每天生产
一个零件的生产单价。在N天的生产中,当天生产的零件可以满足当天的需要,若当天用不完,
可以放到下一天去使用,但要收取每个零件的保管费,不同的天收取的费用也不相同。
问题求解:求得一个N天的生产计划(即N天中每天应生产零件个数),使总的费用最少。
输入:N(天数 N<=29)
每天的需求量 (N个整数)
每天生产零件的单价(N个整数)
每天保管零件的单价(N个整数)
输出:每天的生产零件个数(N个整数)
例如:当N=3时,其需要与费用如下:
┌────┬────┬────┬────┐
│ │ 第一天 │ 第二天 │ 第三天 │
├────┼────┼────┼────┤
│ 需要量 │ 25 │ 15 │ 30 │
├────┼────┼────┼────┤
│生产单价│ 20 │ 30 │ 32 │
├────┼────┼────┼────┤
│保管单价│ 5 │ 10 │ 0 │
└────┴────┴────┴────┘
生产计划的安排可以有许多方案,如下面的三种:
┌────┬────┬────┬───────────┐
│ 第一天 │ 第二天 │ 第三天 │ 总的费用 │
├────┼────┼────┼───────────┤
│ 25 │ 15 │ 30 │25*20+15*30+30*32=1910│
├────┼────┼────┼───────────┤
│ 40 │ 0 │ 30 │40*20+15*5+30*32=1835 │
├────┼────┼────┼───────────┤
│ 70 │ 0 │ 0 │70*20+45*5+30*10=1925 │
└────┴────┴────┴───────────┘
程序说明:
bln]:存放每天的需求量
cln]:每天生产零件的单价
d[n]:每天保管零件的单价
e[n]:生产计划
程序:
program exp5;
var
i,j,n,yu,jO,j1,s :integer;
b, c, d, e : array[O..30] of integer;
begin
readln(n);
for i:=1 to n do readln(b[i] ,c[i] ,d[i]);
for i:=1 to n do e[i]:=0;
____(1)____:=10000; c[n+2]:=0; b[n+1]:=0; j=1;
while (jO<=n) do
begin
yu:=c[jO]; j1:=jO; s:=b[jO];
while ____(2)____ do
begin
____(3)____ j1:=j1+1;s:=s+b[j1];
end;
____(4)____ j0:=j1+1:
end;
for i:=1 to n do write(e[I]:4);
readln;
end.
8 楼
pascal编游戏 [专家分:300] 发布于 2010-08-25 18:44:00
接上面的:
2. 问题描述
将一个含有运算符为:(、)、+、-、*、/、^(乘幂运算)、~(求负运算)的中缀表达式,
如:((1+2)*5)^2-(3+5)/2转化为后缀表达式,如:12+5*2^35+2/-.
[解题思路]将中缀表达式转化为后缀表达式,首先规定运算符的优先数如下:
┌───┬───┬───┬─────┬──────┬───┬───┐
│运算符│ ( │ ) │ +,- │ * ,/ │ ~ │ ~ │
├───┼───┼───┼─────┼──────┼───┼───┤
│优先数│ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │
└───┴───┴───┴─────┴──────┴───┴───┘
1.若输入是运算量,则将该运算量输出;
2.若是左括号“(”,则将该符号的优先数压入设置的运算符堆栈e[p]中去;
3.输入运算符优先数是2,3,4,5时,如果栈空,则将运算符的优先数进栈。如果栈不空,
则将它与栈顶元素进行比较,倘若优先数大于栈顶元素的优先数,则进栈;小于顶元的,则
顶元退栈并输出该运算符,然后再继续比较,直到大于顶元或栈空时进栈;
4.若是右括号“)”,同时栈顶元又为左括号“(”,则栈顶元退栈,并抹去右括号“)”.
否则转3处理;
5.输入完而栈非空,则将栈内内容逐一退栈并输出。所有输出的结果就为后缀表达式。
过程中用到的相关数据结构如下:
type arraydata = array[1..100] of string[20];
const fh:array[1..8] of string[1]
=('(',')','+','-','*','/','~','^');
b:array[1..8] of byte =(0,1,2,2,3,3,4,5);
var d: arraydata; {存储运算量及运算符号}
i,j,m,k: byte;
[过程程序]
procedure hzbds(var d: arraydata; var m: byte );
var: array [ 1.. 100 ] of byte;
i,p,k ,bi:byte;
bl: boolean;
begin
p:=O;k:=1;bj:=0;
while k<=m do
begin
if d[k]=’(‘ then
begin
p:=p+1;e[p]:=1
end
else begin
for i:=2 to 8 do
if ___(1)___ then
begin
b1:= true;
repeat
if ___(2)___ then
begin
p:= p+1 ;e[p]:=i;bj:= 1 ;b1:= false
end
else if ____(3)___ then
if e[p] < >1 then
begin
p:=p+1;e[p]:=i;bj:=1;b1:=false
end
else if d[k] < >')' then
begin
p:=p+1;e[p]:=i;bj:=1;b1:=false
end
else begin
___(4)___;bj:= 1 ;b1:= false;
end
else begin
write(fh[e[p]] ,' ') ;p:=p-1
end;
until b1 = false;
end
if ___(5)___ then write(d[k] ,' ') else bj:=0;
end;
k:=k+1
end
b1:= true;
repeat
if p=0 then b1:= false
else begin
write(fh[e[p]],’’);p:=p-1;
end
until b1 = false;
writeln;
end;
9 楼
pascal编游戏 [专家分:300] 发布于 2010-08-25 18:44:00
第五份:
三.阅读程序写出正确的程序运行结果(4分*8=32分)
1.program t1;
var a,b,n:longint;
begin
readln(n);
a:=0;b:=0;
repeat
a:=a+1;b:=b+a;
until b>=n;
writeln(a);
end.
输入:20100 输出:
2.program t2;
var
n,k,s:longint;
begin
n:=1000000000;
k:=0;
s:=1;
while s<=n do begin
inc(k);
dec(n,s);
inc(s,6*k);
end;
writeln(k);
end.
输出:
3.var
a:array[2..6] of integer;
i,j,m:integer;
begin
for i:=2 to 6 do a[i]:=i+1;
repeat
m:=2;
for i:=3 to 6 do
if a[m]>a[i] then m:=i;
inc(a[m],m);
m:=1;
for i:=2 to 5 do
for j:=i+1 to 6 do
if a[i]<a[j] then m:=0;
until m<>0;
writeln(a[2]);
end.
输出:6
4.const
u: array[0..2] of integer = (1, -3, 2);
v: array[0..1] of integer = (-2, 3);
var
i, n, sum: integer;
function g(n: integer): integer;
var i, sum: integer;
begin
sum := 0;
for i := 1 to n do inc(sum, u[i mod 3] * i);
g := sum;
end;
begin
sum := 0;
read(n);
for i := 1 to n do inc(sum, v[i mod 2] * g(i));
writeln(sum);
end.
输入:103
输出:
四.完善程序题(4分*4+2分*6=28分)
1.单源点最短路径:给定带权有向图G=(v,e),源点v1在v中,求 v1到v中其余各结点的最短路径。
数据结构说明:
cost[I,j]:表示带权有向图的邻接矩阵
d[j]:表示从v1到vj的最短路径长度
path[j]:表示从v1到vj的最短路径
程序如下:
program t5;
const n=5; maxnum=1e10;
type
gr=array[1..n,1..n] of real;
dt=array[1..n] of real;
jh=set of 1..n;
pt=array[1..n] of jh;
var
s:jh;
cost:gr;
d:dt;
path:pt;
i,j,k:integer;
mm:real;
begin
for i:=1 to n do
for j:=1 to n do read(cost[i,j]);
s:=[1];
for i:=2 to n do
begin
d[i]:=cost[1,i];
if d[i] < maxnum then path[i]:=[1]+[i]
else ___(1)___
end;
for i:=1 to n-1 do
begin
mm:=maxnum;
for j:=2 to n do
if ___(2)___ then
begin mm:=d[j];k:=j; end;
s:=s+[k];
for j:=2 to n do
if not(j in s) and (cost[k,j] < maxnum) then
if ___(3)___ then
begin
d[j]:=d[k]+cost[k,j];
path[j]:=___(4)___
end;
end;
writeln;
for i:=2 to n do
begin
writeln('v1->','v',i,':',d[i]);
write('v1');
for j:=2 to n do
if j in path[i] then write('->','v',j);
writeln;
end;
end.
2. 问题描述:将n个整数分成k组(k≤n,要求每组不能为空),显然这k个部分均可得到一个各自的积
p1,p2,……pk,定义整数S为:S=(p1-p2)2+(p1-p3)2+……+(p1-pk)2+(p2-p3)2+……+(pk-1-pk)2
问题求解:求出一种分法,使S为最大(若有多种方案仅记一种〉
程序说明:
数组:a[1],a[2],...A[N]存放原数
p[1],p[2],...,p[K]存放每个部分的积
b[1],b[2],...,b[N]穷举用临时空间
d[1],d[2],...,d[N]存放最佳方案
程序:
program t6;
Var i,j,n,k : integer;
Sum,cmax:longint;
a :array [1..100] of integer;
b,d:array [0..100] of integer;
p :array[1..30] of integer;
begin
readln(n,k);
for I:=1 to n do read(a[I]);
for I:=0 to n do b[I]:=1;
cmax:=0;
while (b[0]=1) do
begin
for I:=1 to k do ___(5)___;
for I:=1 to n do
___(6)___;
sum:=0;
for I:=1 to k-1 do
for j:=___(7)___ do
sum:=sum+(p[I]-p[j])*(p[I]-p[j]);
if ___(8)___ then
begin
cmax:=sum;
for I:=1 to n do d[I]:=b[I];
end;
j:=n;
while ___(9)___ do j:=j-1;
b[j]:=b[j]+1;
for I:=j+1 to n do ___(10)___ ;
end;
writeln(cmax);
for I:=1 to n do write(d[I]:40);
writeln;
end.
10 楼
pascal编游戏 [专家分:300] 发布于 2010-08-25 18:45:00
第六份:
三.阅读程序写出正确的程序运行结果(4分*8=32分)
1.program t1;
var n:integer;
function count(n:integer):integer;
begin
if n=1 then count:=0 else
if n mod 2=0 then count:=count(n div 2)+1 else
count:=count(n*3+1)+1;
end;
begin
readln(n);
writeln(count(n));
end.
输入:99 输出:
2.program t2;
var hi,lo:integer;
procedure pl(m,n:integer;var hi,lo:integer);
var I:integer;
begin
I:=n;hi:=0;lo:=0;
Repeat
I:=I-1;lo:=lo+m;
If lo>=10000 then
begin
Lo:=lo-10000;
Hi:=hi+1;
End;
Until I=0;
Write(hi:4,’, ‘,lo:4);
End;
Begin
P1(200,343,hi,lo);
End.
输出:
3.program t3;
Var d1,d2,X,Min : real;
begin
Min:=10000; X:=3;
while X < 15 do
begin
d1:=sqrt(9+(X-3)*(X-3));
d2:=sqrt(4+(15-X)*(15-X));
if (d1+d2) < Min then Min:=d1+d2;
X:=x+0.001;
end;
writeln(Min:10:2);
end.
输出:
4.program t4;
var i,k,n:integer;
x,w:array[1..500] of integer;
begin
readln(n);
for i:=1 to n do
begin
x[i]:=0;w[i]:=1;
end;
for i:=2 to trunc(sqrt(n))+1 do
if x[i]=0 then
begin
k:=i*i;
while K<=n do
begin
x[k]:=i;
k:=k+i;
end;
end;
for i:=n downto 1 do
if x[i]<>0 then
begin
w[x[i]]:=w[x[i]]+w[i];
w[i div x[i]]:=w[i div x[i]]+w[i];
w[i]:=0;
end;
writeln(w[2],w[3]:5,w[5]:5);
end.
输入:20 输出:
四.完善程序题(4分*7=28分)
1. 降序组合.给定两个自然数n,r(n>r),输出从数1 到n中按降序顺序取r个自然数的所有
组合.例如,n=5,r=3时,有如下组合:
5 4 3
5 4 2
5 4 1
5 3 2
5 3 1
5 2 1
4 3 2
4 3 1
4 2 1
3 2 1
程序如下:
program tk1;
var n,r,i,j:integer;
a:array[1..20] of integer;
begin
write('n,r=');
repeat
readln(n,r);
until n>r;
i:=1;a[1]:=n;writeln('result:');
repeat
if i<>r then
if a[i]>r-i then
begin
___(1)___;i:=i+1;
end
else begin
___(2)___;
a[I]:=a[I]-1 end
else
begin
for j:=1 to r do write(a[j]:3);
writeln;
if a[r]=1 then
begin
i:=i-1; a[i]:=a[i]-1;
end else ___(3)___
end;
until a[1]=r-1;
end.
2. 现在政府计划在某个区域内的的城市间架设高速公路,以使任意两个城市间能够直接或
间接到达,怎样修路,费用最小。
输入文件:第一行一个整数 n(n<=100)表示城市数目。
第二行至第n+1行每行两个数xi,yi(0<=xi,yi<=100)表示第i个城市的坐标(单位:千米);
输出最小费用(每千米一个单位价格)。
程序如下:
program t6;
const maxn=100;
type tcity=record
x,y:real
end;
var c:array[1..maxn] of tcity;
d:array[1..maxn,1..maxn] of real;
p:array[1..maxn] of integer;
n,i,j,k:integer;
a,min:real;
begin
readln(n);
for i:=1 to n do readln(c[i].x,c[i].y);
for i:=1 to n do
for j:=1 to n do
d[i,j]:=sqrt(sqr(c[i].x-c[j].x)+sqr(c[i].y-c[j].y));
p[1]:=0;
for i:=2 to n do ___(4)___
for i:=1 to n-1 do
begin
min:=1e10;
for j:=1 to n do
if ___(5)___ then
begin
min:=d[p[j],j];
___(6)___
end;
a:=a+d[p[k],k];
p[k]:=0;
for j:=1 to n do
if ___(7)___ then p[j]:=k;
end;
writeln(a:0:2);
end.
我来回复