16届国际信息学奥赛试题Word文档格式.docx
《16届国际信息学奥赛试题Word文档格式.docx》由会员分享,可在线阅读,更多相关《16届国际信息学奥赛试题Word文档格式.docx(27页珍藏版)》请在冰豆网上搜索。
CONSTRAINS
Inallinputs,1≤N≤20000,0≤X,Y≤64000and,1<
T≤N.
Additionally,in50%oftheinputs,1<
N<
5000
参考译文:
阿耳特弥斯
(Day1文件名artemis.*内存限制:
16MB,时间限制1s)
问题描述:
宙斯赠予女神阿耳特弥斯一片矩形的土地让其植树。
设矩形的左边为y轴正极的一段,矩形的底边x轴正极的一段,矩形的左下角为(0,0)。
宙斯告诉阿耳特弥斯只能在该矩形的整数坐标点上植树。
阿耳特弥斯喜欢让森林看起来自然一些,因此她采用了这样一种方式植树:
连结两棵树的一条直线从不与x轴或者y轴平行。
宙斯有时要阿耳特弥斯为他伐树,而且这些树必须依照以下方式来来砍伐:
1.宙斯至少想砍掉的树木的数量为T。
2.为了将来能够成功地开展足球运动得开辟一块矩形的球场,阿耳特弥斯必须砍掉这个矩形球场内的所有树木,保留场外的树木。
3.这个矩形的球场的边必须与x轴和y轴平行。
4.该区域的两个对角必须为原有的树木位置,因此位于对角位置的这些树木也必须被砍掉。
阿耳特弥斯爱树心切,她想在不违反上述规定的前提下尽可能多地保留一些树木。
基于上述信息,设必须砍掉的树木的最小值为T,请你编写一个程序,为阿耳特弥斯选定一块伐树的区域。
输入:
输入文件名为artemis.in.第一行包含一个整数N即树木的数量。
第二行包含一个整数T即被伐树木的最小值。
接下来的N行表述的是N棵树的位置,每行包含两个整数X和Y,表示x坐标点和y坐标点。
输出:
输出文件名为artemis.out。
该文件有一行,包含两个整数I和J,两数间空一格:
阿耳特弥斯要用第I棵树(该树为输入文件的第I+2行)以及第J棵树(该树为输入文件的第J+2行)作为伐树区域。
这两个数字的顺序并不相关。
可以有几种方法来选择这些树木,你必须找到并输出其中的一种方案。
在所有的测试方案中至少存在着一种解决方法。
输入输出样例:
artemis.in:
artemis.out:
数据规模:
在所有输入项中,1≤N≤20000,0≤X,Y≤64000and,1<
T≤N.此外,50%的输入项中,1<
N≤5000
试题分析:
如果用数学语言描述的话,可以将试题简述成:
给出平面上的若干个整点,这些点的x轴坐标各不相同,y轴坐标也各不相同。
现在要找出一个边平行于坐标轴的矩形,这个矩形的一对对角点必须是给出的点,且内含的点数(包括对角的两个点)在至少有T个点的前提下尽可能地少。
参考程序1:
#defineNAME“artemis”
charboxdir[1000];
charrundir[1000];
charinfile[1000];
charcorrectfile[1000];
charoutfile[1000];
charscorefile[1000];
charstatusfile[1000];
#include<
stdio.h>
stdlib.h>
string.h>
assert.h>
limits.h>
stdarg.h>
#defineMAXN20000
#defineMAXXY1000000
typedefstruct
20090115
{
intx,y;
intid;
intbl;
}point;
intN,T;
pointP[MAXN];
intbestp,bestq;
intbest;
voidreadin()
FILE*f;
Inti,r;
f=fopen(infile,“r”);
assert(f);
r=fscanf(f,“%d%d”,&
N,&
T);
assert(r==2);
assert(2<
=N&
&
=MAXN);
assert(0<
=T&
T<
=N);
for(i=0;
i<
N;
i++){
r=fscanf(f,“%d%d”,&
P[i].x,&
P[i].y);
assert(P[i].x)=0&
P[i].x(=MAXXY);
assert(P[i].y>
=0&
P[i].y<
=MAXXY);
P[i].id=i+1;
}
fclose(f);
intcompare(constvoid*a,constvoid*b)
return((constpoint*)a)->
x-((constpoint*)b)->
x;
voidtest(intp,intq,intv){
if(v>
=T&
v<
best){
best=v;
if(p[bestp].id>
P[bestq].id){
bestp=p;
bedstq=q;
}else{
bestp=q;
bestq=p;
}
voidsolve()
inti,j;
intvsort[MAXN];
intleft[MAXN];
int1;
qesort(P,N,sizeof(point),compare);
best=INT_MAX;
for(i=0:
i<
N:
i++){
l=0;
for(j=0;
j<
i;
j++){
if(P[j].y<
P[i].y)1++;
left[j]=1;
P[i].b1=1+1;
j<
j++){
if(P[i].y<
P[vsort[j]].y)break;
test(i,vsort[j],
P[i].b1+P[vsort[j]].b1
-left[vsort[j]]-j);
1=j;
for(j=i;
j>
1;
j--){
vsort[j]=vsort[j-1];
test(i,vsort[j],
j+1+left[vsort[j]]+(+1)/*stoumposadded:
+1*/
-P[i].b1-P[vsort[j]]j.b1+1);
vsort[1]=i;
if(best==T){
/*can’tdobetterthanthat*/
break;
assert(best!
=INT_MAX);
inlineintin_range(inta,intt,intb)
return(a<
=t&
t(=b)-︳︳(b<
t<
=a);
voidwrong(char*fmt,…){
va_listap;
FILE*status=fopen(statusfile,“w”);
FILE*score=fopen(scorefile,“w”);
assert(status);
assert(score);
va_start(ap,fmt);
vfprintf(status,fmt,ap);
fclose(status);
fprintf(score,“0﹨n”);
exit
(1);
voidright(char*fmt,…){
FILE*status=fopen(stantusfile,“w”);
fprintf(score,“5﹨n”);
exit(0);
voidcheck(){
intp=0;
intq=0;
inti=0;
intcount=0;
readin();
/*rereadtogetrightorder*/
f=fopen(outfile,“r”);
/*getstudent’ssolution*/
fscanf(f,“%d%d﹨n”,&
p,&
q);
fclose(f);
if(p<
1-︳︳p>
20000)
wrong(“firstvalueof%disoutofrange”,p);
if(q<
1︳︳-q>
wrong(“secondvalueof%disoutofrange”,q);
p—;
q—;
/*checksolution*/
if(in_range(P[p].x,P[i].x,P[q].x)){
if(in_range(P[p].y,P[i].y,p[q].y)){
count++;
if(count>
best)
wrong(“Suboptimal:
soln=%doptimum=%d﹨n”,count,best);
if(count<
T)
wrong(“Solntoosmall:
soln=%dtarget=%d﹨n”,count,T);
right(“OK﹨n”);
intmain(intargc,char**argv){
assert(argc==4);
intcasenum=atoi(argv[1]);
/*casenumber*/
strcpv(boxdir,argv[2]);
/*wherestudent’sprogramran*/
strcpy(rundir,argv[3]);
/*whereauxinfois*/
sprintf(infile,“%s/%s.in”,boxdir,NAME);
/*inputfilename*/
sprintf(correctfile,“%s/%s.correct”,runair,NAME);
/*properoutputfilename*/
sprintf(outfile,“%s/%s.out”,boxdir,NAME);
/*student’soutputfilename*/
springf(scorefile,“%s/%s.score”,rundir,NAME);
/*pointsgohere*/
springf(scorefile,“%s/%s.status”,rundir,NAME),
/*messagegoeshere*/
reading();
solve();
check();
第二题赫尔默斯
Day1.Sourcefilehermes.*
16MB.Maximumrunningtime:
1s.
InamoderncityforGreekgods,thestreetsaregeometricallyarrangedasagridwithintegercoordinateswithstreetsparalleltothexandyaxes.ForeachintegervalueZ,thereisahorizontalstreetaty=Zandaverticalstreetatx=Z.Thisway,integercoordinatepairsrepresentthestreetjunctions.Duringthehotdays,thegodsrestincafeteriasatstreetjunctions.MessengerHermesistosendphotonmessagestogodsrestinginthecafeteriasbyonlymovingalongthecitystreets.Eachmessageisforasinglegod,anditdoesnotmatteriftheothergodsseethemessage.
Themessagesaretobesentinagivenorder,andHermesisprovidedthecoordinatesofthecafeteriasinthatorder.Hermesstartsfrom(0,0).Tosendamessagetoacafeteriaat(Xi,Yi),Hermesonlyneedstovisitsomepointonthesamehorizontalstreet(withy-coordinateYi)oronthesameverticalstreet(withx-coordinateXi).Havingsentallofthemessages,Hermesstops.
Youaretowriteaprogramthat,givenasequenceofcafeterias,findstheminimumtotaldistanceHermesneedstotraveltosendthemessages.
INPUT
Theinputfilenameishermes.in.ThefirstlinecontainsoneintegerN:
thenumberofmessagestobesent.ThefollowingNlinescontainthecoordinatesoftheNstreetjunctionswherethemessagesaretobesent.TheseNlinesareintheorderinwhichthemessagesaretobesent.EachoftheseNlinescontainstwointegers:
firstthex-coordinateandthenthey-coordinateofthestreetjunction.
OUTPUT
Theoutputfilenameishermes.out.Thefileistocontainasinglelinecontainingoneinteger:
theminimumtotaldistanceHermesneedstotraveltosendthemessages.
EXAMPLEINPUTSANSOUTPUTS
hermes.inhermes.out
5
83
7-7
81
-21
6-5
Inallinputs,1≤N≤20000,-1000≤Xi,Yi≤1000
N≤80
赫尔默斯
(Day1文件名hermes.*内存限制:
16MB,时间限制1s)
在一个希腊诸神居住的现代城市,街道是以几何图形排列的,就像是整数轴的坐标网格,每条道路都与x轴或者Y轴平行。
就每一个整数值Z而言,在y=Z处有一条横向街道,在x=Z处有一条纵向街道。
整数坐标点代表街道汇合处。
天热的时候,希腊神要在位于街道汇合处的餐馆里休息。
电报信使赫尔默斯要将电报送到在餐馆休息的诸神手中,他需要在这个城市的各条道路之间穿梭。
每封电报都是专门给某一位神的,但即使其他神看到这封电报也无大碍。
电报必须要按指定顺序来送。
那些餐馆的坐标已经按指定的顺序告诉给赫尔默斯了。
赫尔默斯从(0,0)出发。
为把电报送到位于(Xi,Yi)的餐馆,赫尔默斯只需到达y=Yi的某条横向道路上的一点,或到达x=Xi的某条纵向道路上的一点即可。
送完所有电报后,赫尔默斯就停下来了。
要求你根据指定的餐馆的顺序编写一个程序,算出赫尔默斯送完所有的电报最少需要的行程是多少。
输入文件名为hemes.in。
第一行包含一个整数N,表示需要发送的电报的数量。
接下来的N行包含电报送至的N个街道交汇处的坐标。
这N行按照电报发送的先后顺序来排序。
这N行中的每一行包含两个整数:
第一个为街道交汇处的X坐标,第二个为街道交汇处的Y坐标。
输出文件名为hermes.out。
该文件只有一行,该行只有一个整数即Hermes送完电报最少需要的行程。
输入输出样例:
hermes.in
hermes.out
在所有输入项中,1≤N≤20000,-1000≤Xi,Yi≤1000此外,50%的输入项中1<
N≤80。
我们可以用数学语言将该题简述成:
在一个2000*2