noip提高组 复赛试题及参考程序pascal.docx
《noip提高组 复赛试题及参考程序pascal.docx》由会员分享,可在线阅读,更多相关《noip提高组 复赛试题及参考程序pascal.docx(18页珍藏版)》请在冰豆网上搜索。
noip提高组复赛试题及参考程序pascal
第七届(2001)分区联赛复赛解题报告(提高组)
第一题:
一元三次方程求解(p1.pasp1.inp1.out)
问题描述
有形如:
ax3+bx2+cx+d=0 这样的一个一元三次方程。
给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值>=1。
要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位。
提示:
记方程f(x)=0,若存在2个数x1和x2,且x1样例
输入:
1 -5 -4 20
输出:
-2.00 2.00 5.00
第二题:
数的划分(p2.pas/c/cppp2.inp2.out)
问题描述
将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。
例如:
n=7,k=3,下面三种分法被认为是相同的。
1,1,5;1,5,1;5,1,1;问有多少种不同的分法。
输入:
n,k(6输出:
一个整数,即不同的分法。
样例
输入:
73
输出:
4{四种分法为:
1,1,5;1,2,4;1,3,3;2,2,3;}
第三题:
统计单词个数(p3.pas/c/cppp3.inp3.out)
问题描述
给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个)。
要求将此字母串分成k份(1当选用一个单词之后,其第一个字母不能再用。
例如字符串this中可包含this和is,选用this之后就不能包含th)。
单词在给出的一个不超过6个单词的字典中。
要求输出最大的个数。
输入格式:
输入数据放在文本文件p3.in中,其格式如下:
第一行为一个正整数(0接下来的p行,每行均有20个字符。
再接下来有一个正整数s,表示字典中单词个数。
(1<=s<=6)接下来的s行,每行均有一个单词。
输出格式:
结果输出至屏幕,每行一个整数,分别对应每组测试数据的相应结果。
样例
输入:
1
13
thisisabookyouareaoh
4
is
a
ok
sab
输出:
//说明:
(不必输出)
7//this/isabookyoua/reaoh
第四题:
CAR的旅行路线(p4.pas/c/cppp4.inp4.out)
问题描述
又到暑假了,住在城市A的Car想和朋友一起去城市B旅游。
她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路,第I个城市中高速铁路了的单位里程价格为Ti,任意两个不同城市的机场之间均有航线,所有航线单位里程的价格均为t。
那么Car应如何安排到城市B的路线才能尽可能的节省花费呢?
她发现这并不是一个简单的问题,于是她来向你请教。
任务:
找出一条从城市A到B的旅游路线,出发和到达城市中的机场可以任意选取,要求总的花费最少。
输入文件:
输入文件名p4.in
输出:
p4.out(输出最小费用,小数点后保留1位。
)
输入格式:
第一行为一个正整数n(0<=n<=10),表示有n组测试数据。
每组的第一行有四个正整数s,t,A,B。
S(0
接下来有S行,其中第I行均有7个正整数xi1,yi1,xi2,yi2,xi3,yi3,Ti,这当中的(xi1,yi1),(xi2,yi2),(xi3,yi3)分别是第I个城市中任意三个机场的坐标,TI为第I个城市高速铁路单位里程的价格。
输出格式:
共有n行,每行一个数据对应测试数据。
样例
输入
1
11013
11133130
2574521
86881163
输出:
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(a,b,c,d);
fori:
=-10000to10000do
begin
n:
=i/100;
y:
=n*n*n*a+n*n*b+n*c+d;
ifabs(y)<1e-5thenwrite(n:
0:
2,'');
end;
close(input);close(output);
end.
第二题:
var
n,k:
longint;
functionf(n,k,s:
longint):
longint;
var
sum,i:
longint;
begin
sum:
=0;
ifk=1thenexit
(1);
fori:
=stondivkdo
sum:
=sum+f(n-i,k-1,i);
exit(sum);
end;
begin
assign(input,'p2.in');reset(input);
assign(output,'p2.out');rewrite(output);
readln(n,k);
write(f(n,k,1));
close(input);close(output);
end.
第三题:
Var
p,k,s,n:
integer;
ss:
string[200];
word:
array[1..6]ofstring[200];
g:
array[1..200,1..200]ofbyte;
f:
array[1..200,1..40]ofinteger;
w:
array[1..200]ofbyte;
functionmax(a,b:
integer):
integer;
begin
ifa>bthenexit(a);
exit(b);
end;
procedureinIt;
var
i,j:
integer;
s1:
string;
begin
ss:
='';
readln(p,k);
fori:
=1topdo
begin
readln(s1);
ss:
=ss+s1;
end;
n:
=20*p;
readln(s);
fori:
=1tosdoreadln(word[i]);
fillchar(g,sizeof(g),0);
fillchar(f,sizeof(f),0);
fori:
=1tondo
begin
w[i]:
=200;
forj:
=1tosdo
if(copy(ss,i,length(word[J]))=word[j])and(length(word[j])=length(word[j]);
end;
fori:
=1tondo
forj:
=itondo
forp:
=itojdo
if(w[p]+p-1<=j)theng[i,j]:
=g[i,j]+1;
end;
proceduresolve;
var
i,j:
integer;
begin
fori:
=1tondo
f[i,1]:
=g[1,i];
forp:
=2tokdo
fori:
=ptondo
forj:
=p-1toi-1do
f[i,p]:
=max(f[i,p],f[j,p-1]+g[j+1,i]);
writeln(f[n,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:
longint;
tr:
array[1..100]oflongint;
x,y:
array[1..100,1..4]oflongint;
w:
array[0..400,0..400]ofreal;
functiondis(x1,y1,x2,y2:
longint):
real;
begin
dis:
=sqrt(sqr(x2-x1)+sqr(y2-y1));
end;
proceduresolve;
var
i,j,k,i1,j1:
longint;
l:
real;
begin
readln(s,t,a,b);
ifa=bthen
begin
writeln('0.00');
writeln;
exit;
end;
form:
=1tosdo
begin
readln(x[m,1],y[m,1],x[m,2],y[m,2],x[m,3],y[m,3],tr[m]);
fori:
=1to2do
forj:
=1to3do
ifi<>jthen
if(x[m,j]-x[m,i])*(x[m,6-i-j]-x[m,j])+(y[m,j]-y[m,i])*(y[m,6-i-j]-y[m,j])=0then
begin
x[m,4]:
=x[m,i]-x[m,j]+x[m,6-i-j];
y[m,4]:
=y[m,i]-y[m,j]+y[m,6-i-j];
end;
end;
fori:
=1tosdo
forj:
=1to4do
fork:
=1to4do
w[4*i-4+j,4*i-4+k]:
=dis(x[i,j],y[i,j],x[i,k],y[i,k])*tr[i];
fori:
=1tosdo
fori1:
=1to4do
forj:
=1tosdo
ifi<>jthen
forj1:
=1to4do
w[4*i-4+i1,4*j-4+j1]:
=dis(x[i,i1],y[i,i1],x[j,j1],y[j,j1])*t;
fork:
=1to4*sdo
fori:
=1to4*sdo
ifi<>kthen
forj:
=1to4*sdo
if(w[i,j]>w[i,k]+w[k,j])and(j<>k)and(j<>i)thenw[i,j]:
=w[i,k]+w[k,j];
l:
=1e38;
fori:
=1to4do
forj:
=1to4do
ifw[a*4-4+i,b*4-4+j]=w[a*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);
fort:
=1tondosolve;
close(input);close(output);
end.
方法二:
单元最短路径:
const
inf=1e+38;
var
s,a,b,m,n,t:
longint;
tr:
array[1..100]oflongint;
x,y:
array[1..100,1..4]oflongint;
z:
array[0..100,1..4,1..4]ofreal;
f:
array[0..100,1..4,0..100,1..4]ofreal;
w:
array[0..100,1..4]ofreal;
functiondis(x1,y1,x2,y2:
longint):
real;
begin
dis:
=sqrt(sqr(x2-x1)+sqr(y2-y1));
end;
functiondij(c:
longint):
real;
var
v:
array[1..100,1..4]ofboolean;
i,j,k,g,mc,mp:
longint;
min:
real;
begin
fillchar(v,sizeof(v),false);
fori:
=1tosdo
forj:
=1to4do
w[i,j]:
=f[a,c,i,j];
w[a,c]:
=0;
fori:
=1to4dov[a,i]:
=true;
mc:
=a;mp:
=c;
forj:
=1to4*s-8do
begin
min:
=inf;
fori:
=1tosdo
fork:
=1to4do
if(notv[i,k])and(w[i,k]begin
mc:
=i;
mp:
=k;
min:
=w[i,k];
end;
v[mc,mp]:
=true;
ifmc=bthencontinue;
fori:
=1tosdo
fork:
=1to4do
forg:
=1to4do
if(w[i,k]>w[mc,mp]+f[mc,g,i,k]+z[mc,mp,g])thenw[i,k]:
=w[mc,mp]+f[mc,g,i,k]+z[mc,mp,g];
end;
min:
=w[b,1];
fori:
=2to4do
ifw[b,i]=w[b,i];
exit(min);
end;
proceduresolve;
var
i,j,i1,j1:
longint;
l,k:
real;
begin
readln(s,t,a,b);
form:
=1tosdo
begin
readln(x[m,1],y[m,1],x[m,2],y[m,2],x[m,3],y[m,3],tr[m]);
fori:
=1to2do
forj:
=1to3do
ifi<>jthen
if(x[m,j]-x[m,i])*(x[m,6-i-j]-x[m,j])+(y[m,j]-y[m,i])*(y[m,6-i-j]-y[m,j])=0then
begin
x[m,4]:
=x[m,i]-x[m,j]+x[m,6-i-j];
y[m,4]:
=y[m,i]-y[m,j]+y[m,6-i-j];
end;
fori:
=1to3do
forj:
=1to4do
ifi<>jthen
begin
z[m,i,j]:
=dis(x[m,i],y[m,i],x[m,j],y[m,j])*tr[m];
z[m,j,i]:
=z[m,i,j];
end
else
begin
z[m,i,j]:
=inf;
z[m,j,i]:
=inf;
end;
end;
fori:
=1tosdo
fori1:
=1to4do
forj:
=1tosdo
forj1:
=1to4do
ifi<>jthen
begin
f[i,i1,j,j1]:
=dis(x[i,i1],y[i,i1],x[j,j1],y[j,j1])*t;
f[j,j1,i,i1]:
=f[i,i1,j,j1];
end
else
begin
f[i,i1,j,j1]:
=inf;
f[j,j1,i,i1]:
=inf;
end;
ifa=bthen
begin
writeln('0.00');
writeln;
end
else
begin
l:
=1e38;
fori:
=1to4do
begin
k:
=dij(i);
ifk=k;
end;
writeln(l:
0:
2);
writeln;
end;
end;
begin
assign(input,'car.in');reset(input);
assign(output,'car.out');rewrite(output);
readln(n);
fort:
=1tondosolve;
close(input);close(output);
end.
方法三:
单元最短路径(不是从1出发):
const
inf=1e38;
var
tt,n,s,t,a,b,m:
integer;
tr:
array[1..100]oflongint;
x,y:
array[1..100,1..4]oflongint;
w,z:
array[0..401,0..401]ofreal;
f:
array[0..401]ofreal;
max:
extended;
functiondist(x1,y1,x2,y2:
longint):
real;
begin
dist:
=sqrt(sqr(x2-x1)+sqr(y2-y1));
end;
functiondiska(a:
longint):
real;
var
v:
array[0..401]ofboolean;
k,mc,mp,i,j,p:
longint;
max:
real;
begin
fillchar(v,sizeof(v),false);
v[a]:
=true;
fori:
=1tosdo
forj:
=1to4do
f[4*i-4+j]:
=w[a,4*i-4+j];
forj:
=2to4*sdo
begin
max:
=inf;p:
=a;
fori:
=1tosdo
fork:
=1to4do
if(f[4*i-4+k]begin
max:
=f[4*i-4+k];
mc:
=i;
mp:
=k;
end;
p:
=4*mc-4+mp;
v[p]:
=true;
fori:
=1tosdo
fork:
=1to4do
iff[4*i-4+k]>f[p]+w[p,4*i-4+k]thenf[4*i-4+k]:
=f[p]+w[p,4*i-4+k];
end;
max:
=inf;
fori:
=1to4do
ifmax>f[b*4-4+i]thenmax:
=f[b*4-4+i];
exit(max);
end;
proceduresolve;
var
i,j,k,l:
longint;
ans,min:
real;
begin
readln(s,t,a,b);
ifa=bthen
begin
writeln('0.00');
writeln;
exit;
end;
form:
=1tosdo
begin
readln(x[m,1],y[m,1],x[m,2],y[m,2],x[m,3],y[m,3],tr[m]);
fori:
=1to2do
forj:
=1to3do
ifi<>jthen
if(x[m,j]-x[m,i])*(x[m,6-i-j]-x[m,j])+(y[m,j]-y[m,i])*(y[m,6-i-j]-y[m,j])=0then
begin
x[m,4]:
=x[m,i]-x[m,j]+x[m,6-i-j];
y[m,4]:
=y[m,i]-y[m,j]+y[m,6-i-j];
end;
end;
fori:
=1tosdo
forj:
=1to4do
fork:
=1to4do
w[4*i-4+j,4*i-4+k]:
=dist(x[i,j],y[i,j],x[i,k],y[i,k])*tr[i];
fori:
=1tosdo
forj:
=1to4do
fork:
=1tosdo
ifi<>kthen
forl:
=1to4do
w[4*i-4+j,4*k-4+l]:
=dist(x[i,j],y[i,j],x[k,l],y[k,l])*t;
ans:
=inf;
fork:
=1to4do
begin
min:
=diska(4*a-4+k);
ifmin=min;
end;
writeln(ans:
0:
2);
writeln;
end;
begin
assign(input,'car.in');reset(input);
assign(output,'car.out');rewrite(output);
readln(n);
fortt:
=1tondosolve;
close(input);close(output);
end.