回 帖 发 新 帖 刷新版面

主题:求大量有关noip初赛的的试题,不要历届试题,感激不尽!

本人收了个徒弟,不成器啊,这不,初赛快来了,得先帮她过了初赛啊,急求大量有关‘阅读程序写结果’,‘完善程序’的试题,但不要历届试题(我全有!),像模拟题(有点嚼劲的最好),自编题,或自己积累的。望各方路人兄弟姐妹生出援助之手,感激不尽啊!
有事联系,我qq:1554487236
再次感谢
[em3]

回复列表 (共14个回复)

沙发

大家踊跃点啥,感激不尽啊!

板凳

由于是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 楼

第二份:
三.阅读程序 (前三题每题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 楼

四.完善程序 (前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 楼

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 楼

第三份:
四、阅读程序题(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 楼

第四份:
三.阅读程序写出正确的程序运行结果(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 楼

接上面的:
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 楼

第五份:
三.阅读程序写出正确的程序运行结果(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 楼

第六份:
三.阅读程序写出正确的程序运行结果(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.

我来回复

您尚未登录,请登录后再回复。点此登录或注册