谁有NOTP2007信息学奥林匹克复赛普及组pascal的试题?

这些问题如下:

全国信息学奥林匹克联赛(NOIP2007)复赛推广组

1.奖学金

(scholar.pas/c/cpp)

问题描述

某小学最近收到一笔赞助,打算拿出一部分给学习成绩优秀的前五名学生颁发奖学金。学期结束时,每个学生有三门课:语文、数学和英语。一、按总分从高到低排序。如果两个学生总分相同,那么按照语文成绩从高到低排序。如果两个学生的总成绩和语文成绩相同,那么学号小的学生排名第一,这样每个学生的排名都是唯一的。

任务:首先根据输入的三门课成绩计算总分,然后按照上述规则排序,最后按照排名顺序输出前五名学生的学号和总分。注意,前5名的学生中,每个学生的奖学金都是不一样的,所以你一定要严格按照上面的规则进行排序。例如,在一个正确答案中,如果前两行(每行输出两个数字:学号和总分)的输出数据为:

7 279

5 279

这两行数据的意义是,总分最高的两位同学的学号依次是7号和5号。这两个学生总分279(总分等于语文、数学、英语三科之和),但学号为7的学生语文成绩更高。如果您的前两个输出数据是:

5 279

7 279

那么将作为输出错误处理,不计分。

投入

输入文件scholar.in包含n+1行:

1线为正整数n,表示该校参加选拔的人数。

第2行到第n+1行,每行有三个数字,用空格隔开,每个数字都在0到100之间。Z的1行三个数字依次表示学生的语文、数学、英语成绩。每个学生的学号按照输入顺序编号为l~n(刚好是输入数据的行号减去1)。

所有给出的数据都是正确的,所以不需要检查。

输出

输出文件scholar.out***有五行,每行是两个用空格隔开的正整数,依次表示前五名学生的学号和总分。

输入和输出样本1

学者

90 67 80

87 66 91

78 89 91

88 99 77

67 89 64

78 89 98

学者.完毕

6 265

4 264

3 258

2 244

1 237

输入和输出样本2

学者。在

80 89 89

88 98 78

90 67 80

87 66 91

78 89 91

88 99 77

67 89 64

78 89 98

学者。在外

8 265

2 264

6 264

1 258

5 258

限制

50%的数据满足:每个学生的总分不一样。100%的数据被满足:6

2.纪念品分组

(group.pas/c/cpp)

标题描述

元旦快到了,学生会让乐乐负责发放新年晚会的纪念品。为了使参加聚会的学生获得的纪念品价值相对均衡,他要将购买的纪念品按价格分组,但每组最多只能包括两件纪念品,每组价格之和不能超过给定的整数。为了保证所有的纪念品在最短的时间内发放完毕,乐乐希望小组人数最少。

你的任务是写一个程序,找出所有分组方案中最少的组数,输出最少的组数。

投入

输入文件group.in包含n+2行:

第1行包含一个整数w,是每组纪念品价格之和的上眼=第二行是整数n,表示购买的纪念品总数g。

第3-n+2行包含一个正整数pi (5

输出

输出文件group.out只有→行,并且包含一个整数。ep最小的组数相等。

投入产出样本

组. in

100

90

20

20

30

50

60

70

80

90

团体。在外

限制

50%的数据满足:1

100%的数据满足:1

3.守夜人的逃脱

(escape.pas/c/cpp)

问题描述

猎魔人尤强安野心勃勃。他背叛了暗夜精灵,带领藏在深海的娜迦企图叛变。守望者在与尤迪安的对抗中被围困并被杀害,被困在一个荒岛上。为了杀死守望者,尤迪安开始在这座荒岛上施咒,这座岛很快就会沉没。到时候刀上的人都会被干掉:守望者的奔跑速度是17m/s,以这个速度是不可能逃出荒岛的。好在守望者有闪烁法术,可以在1s内移动60m,但是每次使用闪烁法术都会消耗10法力。守望者的法力恢复速度为4点/秒,只有在休息状态下才能恢复。

现在我们知道了守望者魔法的初始值m,他的初始位置到岛出口的距离s,以及岛沉没的时间t。你的任务是写一个程序,帮助守望者计算如何在最短的时间内逃离荒岛,如果不行,输出守望者在剩余时间内可以走的最远距离。注意:观察者以秒为单位运行、眨眼或休息。并且每个活动的持续时间是整数秒。距离的单位是米。

投入

输入文件escape.in只有一行,包括三个非负整数m、s、t,用空格隔开。

输出

输出文件escape.out包含两行:

1行为字符串为“是”或“否”(区分大小写),即观察器能否逃离荒岛。

第二行包含一个整数,第一行“Yes”(区分大小写)表示逃离荒岛的最短时间。

第一个行为“否”(区分大小写)表示观察者可以行走的最远距离。

输入和输出样本1

逃离. in

39 200 4

逃跑出去

197

输入和输出样本2

逃离. in

36 255 10

逃跑出去

限制

30%的数据符合:1

50%的数据满足:1

100%的数据满足:1

4.河内双塔问题

hanoi.pas/c/cpp

问题描述

给定三个细长的列A、B和C,列A上有2n个中间有间隙的磁盘。* * *有n个不同的大小,每个大小有两个相同的磁盘。请注意,这两个磁盘是无法区分的(下图显示了n=3的情况)。现在要把这些国盘搬到C柱上,搬的时候放在B柱上暂存。要求:

(1)一次只能移动一张光盘;

(2)A、B、C三根细柱上的磁盘要按上小下大的顺序存放;

任务:设An为2n个磁盘完成上述任务所需的最小移动次数。对于输入n,输出一个。

投入

输入文件hanoi.in是正整数n,表示a柱上有2n个磁盘。

输出

输出文件hAnoi.out只有一行,包含一个正整数,这是完成上述任务所需的最少移动次数an。

输入和输出样本1

河内

1

河内,完毕

2

输入和输出样本2

河内

2

河内,完毕

限制

对于50%的数据,1

对于100%数据,1

指出

尝试建立An和An-1之间的递归关系。

因为网上没有解决问题的报告,所以自己写了一份。请参考:

Noip2007问题解决报告

-by orqy0o(就是我~ ~ ~ ~)

第一个问题:学者

这个问题没什么特别的,主要是考察大家对编程的熟练程度。a:=可用二维数组a的x;

a:= x+y+z;

结束;

对于i:=1到n-1 do

对于j:=i+1到n do

如果(a & lta)或((a=a)和(a & lta))或((a[i,1]& gt;a[j,1])和(a=a)和(a=a))那么

开始

swap(a[i,1],a[j,1]);

互换(a,a);

互换(a,a);

结束;

for i:=1到5 do

writeln(a[i,1],' ',a);

关闭(输入);

关闭(输出);

结束。

问题2:小组

这个问题也不难。很多人认为是DP,其实是简单的模拟。先排序(冒泡也可以),然后用两个指针控制下标,一次加第一个(头指针对应的数据)和最后一个(尾指针对应的数据)。如果大于w,计数器加1,同时向后移动头指针;如果比率小于或等于w,则计数器增加1,并且头指针向后移动1位,尾指针向前移动1位。最后输出计数器结果。

该过程如下:

程序组(输入、输出);

定义变量

答:数组[1..30000]的整数;

w,n,I,j,s:整数;

过程qsort(h,t:整数);

定义变量

p,I,j:整数;

开始

I:= h;

j:= t;

p:= a;

重复

while(a[j]& gt;p)和(j & gtI)do j:= j-1;

如果j & gt我然后

开始

a:= a[j];

I:= I+1;

while(a & lt;p)和(i & ltj)do I:= I+1;

如果我& lt那么j

开始

a[j]:= a;

j:= j-1;

结束;

结束;

直到I = j;

a:= p;

I:= I+1;

j:= j-1;

如果我& ltt then qsort(i,t);

如果j & gth然后qsort(h,j);

结束;

开始

赋值(input,' group . in ');

赋值(output,' group . out ');

复位(输入);

重写(输出);

readln(w);

readln(n);

对于i:=1到n do readln(a);

qsort(1,n);

I:= 1;

j:= n;

s:= 0;

而我& lt=j do

开始

如果i=j,那么

开始

s:= s+1;

打破;

结束;

如果a+a[j]& lt;=w那么

开始

I:= I+1;

j:= j-1;

s:= s+1;

结束;

如果a+a[j]& gt;那么w

开始

s:= s+1;

j:= j-1;

结束;

结束;

书写内容;

关闭(输入);

关闭(输出);

结束。

问题3:逃避

没必要用DP,用模拟。因为每次移动都要消耗10的法力,而且每秒4,每次移动也要消耗1秒(有些人不关注这个)。经过对比,我们知道用魔法移动比跑步要快,所以我们试着用魔法,先判断“是”和“不是”,然后找到相应的数据。

该过程如下:

程序转义(输入、输出);

定义变量

a,b:数组[0..longint的10000];

m,s,t,I,j:longint;

function max(a,b,c:longint):longint;

定义变量

k:longint;

开始

如果a & gtb那么k:=a否则k:= b;

如果k & ltc那么k:= c;

max:= k;

结束;

开始

赋值(输入,' escape . in ');

赋值(output,' escape . out ');

复位(输入);

重写(输出);

readln(m,s,t);

对于i:=0到10000 do

开始

a[I]:= 0;

b[I]:= 0;

结束;

for i:=1 to t do

开始

对于j:=0到9 do

开始

b[j]:=max(a[j]+17,a[j+4],0);

如果b[j]& gt;=s那么

开始

writeln(“是”);

writeln(一);

关闭(输入);

关闭(输出);

停止;

结束;

结束;

对于j:=10到m do

开始

b[j]:=max(a[j]+17,a[j+4],a[j-10]+60);

如果b[j]& gt;=s那么

开始

writeln(“是”);

writeln(一);

关闭(输入);

关闭(输出);

停止;

结束;

结束;

a:= b;

结束;

writeln(“否”);

writeln(a[m]);

关闭(输入);

关闭(输出);

结束。

问题4:河内

典型的汉诺塔问题。只是乘以二。我们不需要推导出An和An-1的递归关系,只需要推导出An和n的关系,汉诺单塔的关系是:an = 2 n-1。这里乘以2,得到:an = 2 * (2 n)-1,简化,得到:an = 2 (n+1)-2。用个高精度的就行了。

该过程如下:

程序河内(输入,输出);

定义变量

n,I,j:整数;

答:数组[1..0的100]..9;

过程ppp(k:整数);

定义变量

I,j,w,s:整数;

开始

a[1]:= 1;

w:= 0;

对于i:=1到k do

对于j:=1到100 do

开始

s:= a[j]* 2+w;

a[j]:= s mod 10;

w:= s div 10;

结束;

结束;

开始

赋值(输入,' Hanoi . in ');

赋值(output,' Hanoi . out ');

复位(输入);

重写(输出);

readln(n);

PPP(n+1);

如果a[1]>那么=2

a[1]:=a[1]-2

其他

开始

a[1]:= a[1]+8;

a[2]:= a[2]-1;

结束;

I:= 100;

而a[I]= 0 do I:= I-1;

for j:= I down to 1 do write(a[j]);

writeln

关闭(输入);

关闭(输出);

结束。