谁有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
关闭(输入);
关闭(输出);
结束。