NOIP初赛复习——基础

2018-11-01 18:40

程序: 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; {明确p的含义}

end;

if ⑤ then writeln('找不到!‘) else for i:=1 to n do

if (b[i]=1) then writeln('物质',i,’需要')

else writeln('物质',i,'不需要');

end.

1、P AND (B[0]=0) 2、B[J]:=1; 3、P:=FALSE; 4、(A[I,J]=-1) AND (B[J]=1)

5、P

将2n个0和2n个1,排成一个圈。从任一个位置开始,每次按逆时针的方向以长度为n+1的单位进行数二进制数。要求给出一种排法,用上面的方法产生出来的n+1

2个二进制数都不相同。

例如,当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统计二进制数是否已出现过。 程序清单

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.

1、A[J]:=1; 2、A[I]:=0; 3、S:=0; 4、B[S]:=1; 5、S=32

问题描述:将n个整数分成k组(k≤n,要求每组不能为空),显然这k个部分均可得到一个各自的和s1,s2,??sk,定义整数P为:

P=(S1-S2)+(S1一S3)+??+(S1-Sk)+(s2-s3)+??+(Sk-1-Sk) 问题求解:求出一种分法,使P为最小(若有多种方案仅记一种〉 程序说明:

数组:a[1],a[2],...A[N]存放原数 s[1],s[2],...,s[K]存放每个部分的和 b[1],b[2],...,b[N]穷举用临时空间 d[1],d[2],...,d[N]存放最佳方案 程序:

program exp4;

Var i,j,n,k : integer; a :array [1..100] of integer; b,d:array [0..100] of integer; s :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; cmin:=1000000; while (b[0]=1) do

2

2

2

2

2

begin

for I:=1 to k do ① for I:=1 to n do ② sum:=0;

for I:=1 to k-1 do

for j:= ③ sum:=sum+(s[I]-s[j])*(s[I]-s[j]);

if ④ then begin

cmin:=sum;

for I:=1 to n do d[I]:=b[I]; end; j:=n;

while ⑤ do j:=j-1; b[j]:=b[j]+1;

for I:=j+1 to n do ⑥ end;

writeln(cmin);

for I:=1 to n do write(d[I]:40); writeln; end.

1、 s[k]:=0;

2、 s[b[i]]:= s[b[i]]+a[i]; 3、 i+1 to k 4、 sum

在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 READLN(D[I,J]); END; D[0,0]:=1;

FOR I:=1 TO N+1 DO B[I]:=1; B[0]:=0;

FOR I:=0 TO 1000 DO G[I]:=0; WHILE ① DO ????b[0]=0 BEGIN S:=0;

FOR I:=1 TO N+1 DO

S:= ② ????s+d[i,b[i]]; G[S]:=1;J:=N+1;

WHILE ③ DO J:=J-1; ????b[j]=d[j,0] 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

④ ; ????s:=s+g[i]


NOIP初赛复习——基础.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:华师一2011届高三第二轮复习专题讲座(导数及其应用)导数部分补充

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: