第1题 [问题描述] 输入 n 个 0 到 100 之间的整数,由小到大排序输出,每行输出8个 [程序清单] PROGRAM CHU7_5; VAR I,J,K,N,X:INTEGER; B:ARRAY[0..00] OF INTEGER; BEGIN READLN(N); FOR I:=0 TO 100 DO B[I]:=0; FOR I:=1 TO N DO BEGIN READLN(X); B[X]:=___(1)___ END; ___(2)___ FOR I:=0 TO 100 DO WHILE ___(3)___ DO BEGIN WRITE ___(4)___; K:=K+1; B[I]:=B[I]-1; IF ___(5)___ THEN WRITELN; END; READLN; END.
第2题 [问题描述] 在A、B两个城市之间设有N个路站(如下图中的S1,且N<100),城市与路站之间、 路站和路站之间各有若干条路段(各路段数<=20,且每条路段上的距离均为一个整数)。 A,B的一条通路是指:从A出发,可经过任一路段到达S1,再从S1出发经过任一路 段,…最后到达B。通路上路段距离之和称为通路距离(最大距离<=1000)。当所有的路 段距离给出之后,求出所有不同距离的通路个数(相同距离仅记一次)。 例如:下图所示是当N=1时的情况:
从A到B的通路条数为6,但因其中通路5+5=4+6,所以满足条件的不同距离的通路条数为5。
[算法说明]本题采用穷举算法。 数据结构:N:记录A,B间路站的个数 数组D[I,0]记录第I-1个到第I路站间路段的个数 D[I,1],D[I,2],…记录每个路段距离 数组G记录可取到的距离 [程序清单] program CHU7_6; var i,j,n,s:integer; b:array[0..100] of integer; d:array[0..100,0..20] of integer; g:array[0..1000] of 0..1; begin readln(n); for i:=1 to n+1 do begin readln(d[i,0]); for j:=1 to d[i,0] do read(d[i,j]); end; d[0,0]:=1; for i:=1 to n+1 do b[i]:=1; b[0]:=0; for i:=1 to 1000 do g[i]:=0; while ___(1)___ do begin s:=0; for i:=1 to n+1 do s:= ___(2)___ g[s]:=1;j:=n+1; while ___(3)___ do j:=j-1; b[j]:=b[j]+1; for i:=j+1 to n+1 do b[i]:=1; end; s:=0; for i:=1 to 1000 do ___(4)___; writeln(s);readln; end.
第3题 [问题描述] 存储空间的回收算法。设在内存中已经存放了若干个作业A,B,C,D。其余的 空间为可用的(如图一中(a))。
此时,可用空间可用一个二维数组A表示,(如下表一中(a)),其中:A(i,1) 对应第i个可用空间首址 A(i,2) 对应第i个可用空间长度如上图中,A:
|
表一(a),(b) |
|
0 |
0 |
|
100 |
50 |
|
300 |
100 |
|
500 |
100 |
|
10000 |
0 | |
现某个作业释放一个区域,,其首址为d,长度为L,此时将释放区域加人到 可用空间表中。要求在加入时,若可用空间相邻时,则必须进行合并。因此出现 下面的4种情况(如上图一(b)所示)。 (1)下靠,即回收区域和下面可用空间相邻,例如,d=80,L=20,此时成为 表二中的(a)。 (2)上靠,例如,d=600,L=50,此时表成为表二中的(b) (3)上、下靠,例如,d=150,L=150,此时表成为表二中的(c)。 (4)上、下不靠,例如,d=430,L=20,此时表成为表二中的(d)。
|
|
|
|
|
100 |
50 |
|
300 |
100 |
|
430 |
20 |
|
500 |
100 | |
|
表二(a)下靠 |
表二(b)上靠 |
表二(c)上、下靠 |
表二(d)上、下不靠 |
[程序说明] 对数组A预置2个标志,即头和尾标志,成为表二中(b),这样可使算法简单, SP为A表末地址。 [程序清单] Program GAO7_5; 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]
第4题 [问题描述] 求关键路径 设有一个工程网络如下图表示(无环路的有向图):其中,顶点表示活动,①表示 工程开始,⑤表示工程结束(可变,用N表示),边上的数字表示活动延续的时间。
如上图中,活动①开始5天后活动②才能开始工作,而活动③则要等①、②完成之 后才能开始,即最早也要7天后才能工作。 在工程网络中,延续时间最长的路径称为关键路径。上图中的关键路径为: ①——②——③——④——⑤共18天完成。 关键路径的算法如下: 1.数据结构: 数组 R 表示活动的延续时间,若无连线,则用-1表示; EET 表示活动最早可以开始的时间 ET 表示活动最迟应该开始的时间 关键路径通过点J,具有如下的性质:EET(J)=ET(J) 2.约定: 结点的排列已经过拓扑排序,即序号前面的结点会影响序号后面结点的活动。 [程序清单] program gao7_6; var i,j,n,max,min,w,x,y:integer; r:array[1..20,1..20] of integer; eet,et:array[1..20] of integer; begin readln(n); for i:=1 to n do for j:=1 to n do r[i,j]:=-1; readln(x,y,w); while x<>0 do begin r[x,y]:=w; readln(x,y,w); end; eet[1]:=0; for i:=2 to n do begin max:=0; for j:=1 to n do if r[j,i]<>-1 then if r[j,i]+eet[j]>max then max:=r[j,i]+eet[j]; eet[i]:=max; end; et[i]:=eet[i]; for i:=n-1 downto 1 do begin min:=10000; for j:=1 to n do if r[i,j]<>-1 then if et[j]-r[i,j]<>-1 then write(i,'to'); write(n);readln; end.
|