回 帖 发 新 帖 刷新版面

主题:帮帮我呀,大哥!来了就给分!

2009年的市赛,谁会?用PASIC,我重赏他

注意事项

1. 考试时间为150分钟。

2. 务必看清题目,严格按照所要求的格式输入、输出。

3. 在调试程序时请先使用题目中的示例数据,然后再自行设计多组测试数据进行调试。

4. 每题一般有10个测试点,测试有严格的时间限制,请尽可能优化算法。

5. 命名规则:

(1)每题都规定了该题的英文名称。

(2)程序文件和数据文件的主文件名都是该题的英文名字。

(3)程序文件扩展名采用语言环境的默认扩展名。

(4)数据文件都是文本文件,输入和输出文件的扩展名分别是.in和.out。

6. 程序应从输入文件读取数据,并严格地按照规定的输出格式将结果输出到输出文件中。输入数据文件和输出数据文件都与程序在同一个目录中,由于程序所在目录是不确定的,因此不允许在文件名中含有盘符信息和任何形式的路径信息。

7. 选手应在D盘的根目录下建立以准考证号命名的文件夹,并将所完成各题的源程序文件和可执行文件拷贝到该文件夹中。


 1.乘车费用(taxi.bas/ taxi.pas/ taxi.c)

【问题描述】

元旦快到了,小W的班级准备举办元旦庆祝活动,小W和几个同学一起帮助班主任老师进行准备。小W带着几个同学乘坐出租车去买东西。在出租车上,他们向司机师傅了解到出租车计价方案为:2.5公里以内起步价是6元,超过2.5公里之后按1.2元/公里计价,超过10公里之后在1.2元/公里的基础上加价50%,另外,停车等候时间则按时间计费后加入总价:1元/5分(注:不满5分钟不计费)。好奇的小W想自己先估算一下大概要多少费用。已知:小W等人乘坐出租车路程为N公里,中间停车等候时间总共M分钟,请计算小W应付的出租车费用是多少元?

【输入文件】

输入文件共有一行,包含两个整数N,M,分别表示出租车行驶的里程和中间停车的时间,中间以空格分开,0≤N≤200,0≤M≤60。

【输出文件】

输出仅包含一个整数,表示小W应付的乘车费用,四舍五入到整数元。

【输入样例】

8 7

【输出样例】

14

 2.围墙重建(wall.bas/ wall.pas/ wall.c)

【问题描述】

为了给同学们营造一个良好的学习环境和方便学校的管理,市政府准备对小W就读的学校进行重新规划,占地面积将再次扩大。学校通过领导会议决定,重建学校的围墙。由于学校太大,重建围墙也不是一件小项目,学校决定请专门的建筑公司来建筑。

许多建筑公司从网上得知这个消息后,纷纷来到学校,找到学校领导,对自己公司进行介绍,并希望能接下这个项目。学校领导对很多家公司印象都还不错,难以取舍,为了公平,学校决定通过竞标决定把这个项目交给哪家公司负责。这次竞标是由学校自主决定的,不但要注重建筑实力,而且还要看建筑公司是否有足够的智慧。

学校通过两轮选拔。第一轮,选出建筑实力较强的公司。进入第二轮后,由学校专门负责这个项目的领导进行智力考核。

领导说:为了美观,我们准备建设一面2米高的围墙,围墙建好后,墙外要贴上有图画的瓷砖,当然这就需要瓷砖越大越美观了。目前市面用的最大瓷砖是多大?

公司:宽1米,长2米的

领导:哦,我们就用这种吧,我们学现需建筑N米长的围墙,如果用这种瓷砖来贴,总共有多少种贴法呢?

公司:…………….(正在计算中……………)

【输入文件】

输入文件为一个数N(1<N<10000),表示围墙的长度。

【输出文件】

输出一个数,表示如果用宽1米、长2米,贴在高2米,长N米的围墙上,最多有多少种贴法?(输出数据后需换行)

【样例输入1】

4

【样例输出1】

5

【样例输入2】

6

【样例输出2】

13

【数据规模】

对于20%的数据,2<N<90;

对于60%的数据,2<N ≤1200;

对于100%的数据,2< N<10000。


 3.走迷宫(maze.bas/ maze.pas/ maze.c)

【问题描述】

小W来到一个迷宫游玩,他发现迷宫非常特别。这个迷宫共有N层楼,配备了一个特别的电梯。迷宫的每一层都可以停电梯,而且第i层 (1<=i<=N)上有一个数字Ki(0<=Ki<=N),电梯内只提供四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如:4 2 1 2 5代表了Ki(K1=4,K2=2,……),从一楼开始。在一楼,按“上”可以到5楼,按“下”是不起作用的,因为没有-3楼。进入迷宫中的人都想尽可能地少按电梯到达目的地,假如给你出发楼层A和目的楼层B,请你帮忙求出从A层到B层至少要按几次按钮。

【输入文件】

输入文件共有二行,第一行为三个用空格隔开的正整数,表示N,A,B(1≤N≤200, 1≤A,B≤N),第二行为N个用空格隔开的正整数,表示Ki。

【输出文件】

输出文件仅一行,即最少按键次数,若无法到达,则输出-1。

【输入样例】

5 1 5

4 2 1 2 5

【输出样例】

1


  4.足球联赛(football.bas/ football.pas/ football.c)

【问题描述】

为了庆祝元旦,J市决定举办全市小学足球联赛。各学校积极响应,共有N支球队报名参加,爱好足球的小W也参加了。为了活动的开展和不影响学生学习,只能安排K场比赛,每支球队最多参加两场比赛,至少参加零场比赛。因球队水平不同,每支球队都拥有一个和其他球队不同的水平等级(用一个正整数来表示)。在比赛中,等级高的球队必须作为客场,等级低的球队必须作为主场。每个球队最多只能做一次主场和一次客场。为了增加比赛的观赏度,观众希望K场比赛中球队水平差距的总和最小。比如有7支球队,他们的等级分别是30、17、26、41、19、38、18,要进行3场比赛。那么最好安排是球队2 vs 球队7, 球队7 vs 球队5 ,球队6 vs 球队4,此时等级差的总和等于(18-17) + (19-18) + (41-38) = 5达到最小。

【输入文件】

第一行两个正整数N ,K。

接下来有N 行,第i行表示第i 支球队的等级。

【输出文件】

共一行,输出最小的等级差的总和。

【样例输入】

7 3 

30 

17 

26 

41 

19 

38 

18

【样例输出】

5

【数据范围】

对于20%的数据,1≤N≤300 

对于80%的数据,1≤N≤5000

对于100%的数据,1≤N≤10000 

保证所有输入数据中等级的值小于32000,1 ≤K≤ N-1

回复列表 (共14个回复)

11 楼

//第三题-最短路径
program maze;
const maxn=1000000;
var
   a:array[1..200,1..200]of longint;
   i,j,k,p,n,x,y:longint;
begin
   fillchar(a,sizeof(a),maxn);
   readln(n,x,y);
   for i:=1 to n do begin
     read(k);
     if i+k<=n then a[i,i+k]:=1;
     if i-k>=1 then a[i,i-k]:=1;
   end;
   for k:=1 to n do begin
     for i:=1 to n do
       for j:=1 to n do begin
         if(i<>j)and(a[i,j]<>1) then begin
           for p:=1 to n do if(p<>i)and(p<>j)and(a[i,p]+a[p,j]<a[i,j])then a[i,j]:=a[i,p]+a[p,j];
         end;
       end;
   end;
   if a[x,y]=maxn then writeln('-1')
                  else writeln(a[x,y]);
   readln;
end.

12 楼

这么写恐怕得50分都难吧!

13 楼

//本题不会,只能用贪心碰碰运气,不知能得多少分啊!帮忙用数据测试一下,把分告诉我,ok?
//发到我qq来也可  qq:1554487236;  thanks very much!
program football;
var
  a,b:array[1..10000]of longint;
  c:array[1..100000]of boolean;
  i,j,n,k,s:longint;
procedure quick1(l,r:integer);
var i,j,m,k:integer;
begin
   i:=l; j:=r;
   m:=a[(l+r)div 2];
   repeat
     while a[i]<m do inc(i);
     while a[j]>m do dec(j);
     if i<=j then begin
       k:=a[i]; a[i]:=a[j]; a[j]:=k;
       inc(i); dec(j);
     end;
   until i>j;
   if j>l then quick1(l,j);
   if i<r then quick1(i,r);
end;

procedure quick2(l,r:integer);
var i,j,m,k:integer;
begin
   i:=l; j:=r;
   m:=b[(l+r)div 2];
   repeat
     while b[i]<m do inc(i);
     while b[j]>m do dec(j);
     if i<=j then begin
       k:=b[i]; b[i]:=b[j]; b[j]:=k;
       inc(i); dec(j);
     end;
   until i>j;
   if j>l then quick2(l,j);
   if i<r then quick2(i,r);
end;

begin
  readln(n,k);
  for i:=1 to n do readln(a[i]);
  quick1(1,n);
  for i:=1 to n-1 do b[i]:=a[i+1]-a[i];
  quick2(1,n-1);
  for i:=1 to k do s:=s+b[i];
  writeln(s);
  readln;
end.

14 楼

谢之!

我来回复

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