第1题 [问题描述] 将2n个0和2n个1,排成一个圈。从任一个位置开始,每次按逆时针的方向以长度 为n+1的单位进行数二进制数。要求给出一种排法,用上面的方法产生出来的2n+1个二 进制数都不相同。例如,当n=2时,即22个0和22个1排成如下一圈:
比如,从A位置开始,逆时针方向取三个数000,然后再从B位置上开始取三个数001, 接着从C开始取三个数010,…可以得到000,001,010,101,011,111,110,100共8 个二进制数且都不相同。 [程序说明] 以N=4为例,即有16个0,16个1,数组A用以记录32个0,1的排法,数组B统计二进 制数是否已出现过。 [程序清单] PROGRAM NOI00; VAR A :ARRAY[1..36] OF 0..1; B :ARRAY[0..31] OF INTEGER; I,J,K,S,P:INTEGER; BEGIN FOR I:=1 TO 36 DO A[I]:=0; FOR I:=28 TO 32 DO A[I]:=1; P:=1;A[6]:=1; WHILE (P=1) DO BEGIN J:=27; WHILE A[J]=1 DO J:=J-1; ( ① ) FOR I:=J+1TO 27 DO( ② ) FOR I:=0 TO 31 DO B[1]:=O; FOR I:=1 TO 32 DO BEGIN ( ③ ) FOR K:=I TO I+4 DO S:=S*2+A[K]; ( ④ ) END; S:=0; FOR I:=0 TO 31 DO S:=S+B[I]; IF( ⑤ )THEN P:=0 END; FOR I:=1 TO 32 DO FOR J:=I TO I+4 DO WRITE(A[J]); WRITELN END.
第2题 [问题描述] 多项式乘法运算:p(x)=2x2-x+1,q(x)=x+1 p(x)*q(x)=(2x2-x+1)(x+1)=2x3+x2+1 [程序说明] 多项式的表示:系数、指数 如上例中:p(x) 系数 指数 q(x) 系数 指数 2 2 1 1 -1 1 1 0 1 0 0 0 0 0 p*q的结果存入c中。其输出格式是:依次用一对括号内的(系数、指数)分别来表示。 如上例的输出结果表示为:(2,3)(1,2)(1,0) [程序清单] begin jp:=0; readln(x,y); while x <> 0 do begin jp:=jp+l; p[jp,1]:=x; p[jp,2]:=y;readln(x,y); end; jq:=0; readln(x,y); while x <> 0 do begin jq:=jq+1; q[jq,1]:=x; q[jq,2]:=y; readln(x,y); end; jc:=1;c[jc,1]:=0; c[jc,2]:=-1000; for i:= 1 to jp do begin ___(1)___ y:=p[i,2]; for j:= 1 to jq do begin ___(2)___ y1:=y+q[j,2]; k:=1; while y1 < c[k,2] do k:=k+1; if y1 = c[k,2] then ___(3)___ else begin for l:= jc downto k do begin c[l+1,1]:=c[l,1]; c[l+1,2]:=c[l,2]; end; c[k,1]:=x1;c[k,2]:=y1; ___(4)___ end; end; for i:=1 to jc do if ___(5)___ then write('(',c[i,1],',',c[i,2],')') ; end.
第3题 [问题描述] 求出一棵树的深度和宽度。例如有如下的一棵树: 其树的深度为从根结点开始到叶结点结束的最大深度,树的宽度为同一层上结点数的 最大值。在上图中树的深度为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
[程序清单] PROGRAM NOI00_6; 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.
|