1、noip提高组 复赛试题及参考程序pascal第七届(2001)分区联赛复赛解题报告(提高组)第一题:一元三次方程求解(p1.pas p1.in p1.out)问题描述有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程。给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值=1。要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位。提示:记方程f(x)=0,若存在2个数x1和x2,且x1x2,f(x1)*f(x2)0,则在(x1,x2)之间一定有一个 根。样例输入:1 -5
2、 -4 20输出:-2.00 2.00 5.00第二题:数的划分(p2.pas/c/cpp p2.in p2.out)问题描述将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。例如:n=7,k=3,下面三种分法被认为是相同的。1,1,5; 1,5,1; 5,1,1;问有多少种不同的分法。输入:n,k (6n=200,2=k=6)输出:一个整数,即不同的分法。样例输入: 7 3输出:4 四种分法为:1,1,5;1,2,4;1,3,3;2,2,3;第三题:统计单词个数(p3.pas/c/cpp p3.in p3.out)问题描述给出一个长度不超过200的由小写英文字母组成的字母串(
3、约定;该字串以每行20个字母的方式输入,且保证每行一定为20个)。要求将此字母串分成k份(1k=40),且每份中包含的单词个数加起来总数最大(每份中包含的单词可以部分重叠。当选用一个单词之后,其第一个字母不能再用。例如字符串this中可包含this和is,选用this之后就不能包含th)。单词在给出的一个不超过6个单词的字典中。要求输出最大的个数。输入格式:输入数据放在文本文件p3.in中,其格式如下:第一行为一个正整数(0n=5)表示有n组测试数据每组的第一行有二个正整数(p,k),p表示字串的行数;k表示分为k个部分。接下来的p行,每行均有20个字符。再接下来有一个正整数s,表示字典中单词
4、个数。(1=s=6)接下来的s行,每行均有一个单词。输出格式:结果输出至屏幕,每行一个整数,分别对应每组测试数据的相应结果。样例输入: 11 3thisisabookyouareaoh4isaoksab输出: /说明:(不必输出)7 / this/isabookyoua/reaoh第四题:CAR的旅行路线(p4.pas/c/cpp p4.in p4.out)问题描述又到暑假了,住在城市A的Car想和朋友一起去城市B旅游。她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路,第I个城市中高速铁路了的单位里程价格为Ti,任意两个不同城市的机场之间
5、均有航线,所有航线单位里程的价格均为t。那么Car应如何安排到城市B的路线才能尽可能的节省花费呢?她发现这并不是一个简单的问题,于是她来向你请教。任务:找出一条从城市A到B的旅游路线,出发和到达城市中的机场可以任意选取,要求总的花费最少。输入文件:输入文件名p4.in输 出:p4.out(输出最小费用,小数点后保留1位。)输入格式:第一行为一个正整数n(0=n=10),表示有n组测试数据。每组的第一行有四个正整数s,t,A,B。S(0S=100)表示城市的个数,t表示飞机单位里程的价格,A,B分别为城市A,B的序号,(1=A,B=S)。接下来有S行,其中第I行均有7个正整数xi1,yi1,xi
6、2,yi2,xi3,yi3,Ti,这当中的(xi1,yi1),(xi2,yi2),(xi3,yi3)分别是第I个城市中任意三个机场的坐标,T I为第I个城市高速铁路单位里程的价格。输出格式:共有n行,每行一个数据对应测试数据。 样例输入11 10 1 31 1 1 3 3 1 302 5 7 4 5 2 18 6 8 8 11 6 3输出:47.55参考程序:第一题:var y,n,a,b,c,d:real; i:longint;begin assign(input,p1.in);reset(input); assign(output,p1.out);rewrite(output); read
7、(a,b,c,d); for i:=-10000 to 10000 do begin n:=i/100; y:=n*n*n*a+n*n*b+n*c+d; if abs(y)b then exit(a); exit(b);end;procedure inIt;var i,j:integer; s1:string;begin ss:=; readln(p,k); for i:=1 to p do begin readln(s1); ss:=ss+s1; end; n:= 20*p; readln(s); for i:=1 to s do readln(wordi); fillchar(g,size
8、of(g),0); fillchar(f,sizeof(f),0); for i:=1 to n do begin wi:=200; for j:=1 to s do if (copy(ss,i,length(wordJ)=wordj)and(length(wordj)wi)then wi := length(wordj); end; for i:=1 to n do for j:=i to n do for p:=i to j do if (wp+p-1=j) then gi,j:=gi,j+1;end;procedure solve;var i,j:integer;begin for i:
9、=1 to n do fi,1:=g1,i; for p:=2to k do for i:=p to n do for j:=p-1 to i-1 do fi,p:=max(fi,p,fj,p-1+gj+1,i); writeln(fn,k);end;begin assign(input,p3.in);reset(input); assign(output,p3.out);rewrite(output); init; solve; close(input);close(output);end.第四题:方法一:Folyd:const inf=1e+38;var s,a,b,m,n,t:longi
10、nt; tr:array1.100of longint; x,y:array1.100,1.4of longint; w:array0.400,0.400of real;function dis(x1,y1,x2,y2:longint):real;begin dis:=sqrt(sqr(x2-x1)+sqr(y2-y1);end;procedure solve;var i,j,k,i1,j1:longint; l:real;begin readln(s,t,a,b); if a=b then begin writeln(0.00); writeln; exit; end; for m:=1 t
11、o s do begin readln(xm,1,ym,1,xm,2,ym,2,xm,3,ym,3,trm); for i:=1 to 2 do for j:=1 to 3 do if ij then if (xm,j-xm,i)*(xm,6-i-j-xm,j)+(ym,j-ym,i)*(ym,6-i-j-ym,j)=0 then begin xm,4:=xm,i-xm,j+xm,6-i-j; ym,4:=ym,i-ym,j+ym,6-i-j; end; end; for i:=1 to s do for j:=1 to 4 do for k:=1 to 4 do w4*i-4+j,4*i-4
12、+k:=dis(xi,j,yi,j,xi,k,yi,k)*tri; for i:=1 to s do for i1:=1 to 4 do for j:=1 to s do if ij then for j1:=1 to 4 do w4*i-4+i1,4*j-4+j1:=dis(xi,i1,yi,i1,xj,j1,yj,j1)*t; for k:=1 to 4*s do for i:=1 to 4*s do if ik then for j:=1 to 4*s do if (wi,jwi,k+wk,j)and(jk)and(ji)then wi,j:=wi,k+wk,j; l:=1e38; fo
13、r i:=1 to 4 do for j:=1 to 4 do if wa*4-4+i,b*4-4+jl then l:=wa*4-4+i,b*4-4+j; writeln(l:0:2); writeln;end;begin assign(input,car.in);reset(input); assign(output,car.out);rewrite(output); readln(n); for t:=1 to n do solve; close(input);close(output);end.方法二:单元最短路径:const inf=1e+38;var s,a,b,m,n,t:lon
14、gint; tr:array1.100of longint; x,y:array1.100,1.4of longint; z:array0.100,1.4,1.4of real; f:array0.100,1.4,0.100,1.4of real; w:array0.100,1.4of real;function dis(x1,y1,x2,y2:longint):real;begin dis:=sqrt(sqr(x2-x1)+sqr(y2-y1);end;function dij(c:longint):real;var v:array1.100,1.4of boolean; i,j,k,g,m
15、c,mp:longint; min:real;begin fillchar(v,sizeof(v),false); for i:=1 to s do for j:=1 to 4 do wi,j:=fa,c,i,j; wa,c:=0; for i:=1 to 4 do va,i:=true; mc:=a; mp:=c; for j:=1 to 4*s-8 do begin min:=inf; for i:=1 to s do for k:=1 to 4 do if (not vi,k)and(wi,kwmc,mp+fmc,g,i,k+zmc,mp,g)then wi,k:=wmc,mp+fmc,
16、g,i,k+zmc,mp,g; end; min:=wb,1; for i:=2 to 4 do if wb,imin then min:=wb,i; exit(min);end;procedure solve;var i,j,i1,j1:longint; l,k:real;begin readln(s,t,a,b); for m:=1 to s do begin readln(xm,1,ym,1,xm,2,ym,2,xm,3,ym,3,trm); for i:=1 to 2 do for j:=1 to 3 do if ij then if (xm,j-xm,i)*(xm,6-i-j-xm,
17、j)+(ym,j-ym,i)*(ym,6-i-j-ym,j)=0 then begin xm,4:=xm,i-xm,j+xm,6-i-j; ym,4:=ym,i-ym,j+ym,6-i-j; end; for i:=1 to 3 do for j:=1 to 4 do if ij then begin zm,i,j:=dis(xm,i,ym,i,xm,j,ym,j)*trm; zm,j,i:=zm,i,j; end else begin zm,i,j:=inf; zm,j,i:=inf; end; end; for i:=1 to s do for i1:=1 to 4 do for j:=1
18、 to s do for j1:=1 to 4 do if ij then begin fi,i1,j,j1:=dis(xi,i1,yi,i1,xj,j1,yj,j1)*t; fj,j1,i,i1:=fi,i1,j,j1; end else begin fi,i1,j,j1:=inf; fj,j1,i,i1:=inf; end; if a=b then begin writeln(0.00); writeln; end else begin l:=1e38; for i:=1 to 4 do begin k:=dij(i); if kl then l:=k; end; writeln(l:0:
19、2); writeln; end;end;begin assign(input,car.in);reset(input); assign(output,car.out);rewrite(output); readln(n); for t:=1 to n do solve; close(input);close(output);end.方法三:单元最短路径(不是从1出发):const inf=1e38;var tt,n,s,t,a,b,m:integer; tr:array1.100of longint; x,y:array1.100,1.4of longint; w,z:array0.401,
20、0.401of real; f:array0.401 of real; max:extended;function dist(x1,y1,x2,y2:longint):real;begin dist:=sqrt(sqr(x2-x1)+sqr(y2-y1);end;function diska(a:longint):real;var v:array0.401 of boolean; k,mc,mp,i,j,p:longint; max:real;begin fillchar(v,sizeof(v),false); va:=true; for i:=1 to s do for j:=1 to 4
21、do f4*i-4+j:=wa,4*i-4+j; for j:=2 to 4*s do begin max:=inf; p:=a; for i:=1 to s do for k:=1 to 4 do if (f4*i-4+kfp+wp,4*i-4+k then f4*i-4+k:=fp+wp,4*i-4+k; end; max:=inf; for i:=1 to 4 do if maxfb*4-4+i then max:=fb*4-4+i; exit(max);end;procedure solve;var i,j,k,l:longint; ans,min:real;begin readln(
22、s,t,a,b); if a=b then begin writeln(0.00); writeln; exit; end; for m:=1 to s do begin readln(xm,1,ym,1,xm,2,ym,2,xm,3,ym,3,trm); for i:=1 to 2 do for j:=1 to 3 do if ij then if (xm,j-xm,i)*(xm,6-i-j-xm,j)+(ym,j-ym,i)*(ym,6-i-j-ym,j)=0 then begin xm,4:=xm,i-xm,j+xm,6-i-j; ym,4:=ym,i-ym,j+ym,6-i-j; en
23、d; end; for i:=1 to s do for j:=1 to 4 do for k:=1 to 4 do w4*i-4+j,4*i-4+k:=dist(xi,j,yi,j,xi,k,yi,k)*tri; for i:=1 to s do for j:=1 to 4 do for k:=1 to s do if ik then for l:=1 to 4 do w4*i-4+j,4*k-4+l:=dist(xi,j,yi,j,xk,l,yk,l)*t; ans:=inf; for k:=1 to 4 do begin min:=diska(4*a-4+k); if minans then ans:=min; end; writeln(ans:0:2); writeln;end;begin assign(input,car.in);reset(input); assign(output,car.out);rewrite(output); readln(n); for tt:=1 to n do solve; close(input); close(output);end.
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1