第十四届全国青少年信息学奥林匹克联赛初赛试题
(普及组Pascal 语言二小时完成)
●●全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效●●
一、单项选择题(共20题,每题1.5分。每题有且仅有一个正确答案。)
1.微型计算机中,控制器的基本功能是()。
A.控制机器各个部件协调工作B.实现算术运算和逻辑运算
C.获取外部信息D.存放程序和数据
2.设A=True,B=False,C=True,D=False,以下逻辑运算表达式值为真的是()。
A.(A∧B)∨(C∧D∨﹁A)B.((﹁A∧B)∨C)∧﹁D
C.(B∨C∨D)∧D∧AD.A∧(D∨﹁C)∧B
3.在下列关于图灵奖的说法中,不正确的是()。
A.图灵奖是美国计算机协会于1966年设立的,专门奖励那些对计算机事业作出重要贡献的个人
B.图灵奖有“计算机界诺贝尔奖”之称
C.迄今为止,还没有华裔计算机科学家获此殊荣
D.图灵奖的名称取自计算机科学的先驱、英国科学家阿兰•图灵
4.计算机在工作过程中,若突然停电,()中的信息不会丢失。
A.ROM和RAM B.CPUC.ROMD.RAM
5.完全二叉树共有2*N-1个结点,则它的叶节点数是()。
A.N-1B.NC.2*ND.2N-1
6.在以下各项中,()不是操作系统软件。
A.SolarisB.LinuxC.WindowsVista D.Sybase
7.设栈S 的初始状态为空,元素a,b,c,d,e,f依次入栈S,出栈的序列为b,d,f,e,c,a,则栈S 的容量至少应该是()。
A.6B.5C.4D.3
8.与十进制数28.5625相等的四进制数是()。
A.123.21B.131.22C.130.22D.130.21
9.设字符串S=”Olympic”,S的非字串的数目是()。
A.28B.29C.16D.17
10.Web2.0是近年来互联网的热门概念之一,其核心思想是互动与分享。下列网站中,()是典型的Web 2.0应用。
A.SinaB.FlickerC.YahooD.Google
11.递归过程或函数调用时,处理参数和返回地址,通常使用一种称为()的数据结构。
A.队列B.多维数组C.线性表D.栈
12.(2008)10+(5B)16的结果是()。
A.(833)16B.(2089)10C.(4163)8D.([1**********]1)2
13.二叉树T,已知其先根遍历是1243576(数字为节点的编号,下同),中根遍历2415736,则该二叉树的后根遍历是()。
A.4257631B.4275631C.7425631D.4276531
14.将数组{8,23,4,16,77,-5,53,100}中的元素按从小到大的顺序排列,每次可以交换任意两个元素,最少需要交换()次。
A.4B.5C.6D.7
15.对有序数组{5,13,19,21,37,56,64,75,88,92,100}进行二分查找,成功查找元素19的查找长度(比较次数)是()。
A.1B.2C.3D.4
16.面向对象程序设计(Object-OrientedProgramming)是一种程序设计的方法论,它将对象作为程序的基本单元,将数据和程序封装在对象中,以提高软件的重用性、灵活性和扩展性。下面关于面向对象设计的说法中,不正确的是()
A.面向对象程序设计通常采用自顶向下设计方法进行设计。
B.面向对象程序设计方法具有继承性(inheritance)、封装性(encapsulation)、多态性(polymorphism)等几大特点。
C.支持面向对象特性的语言称为面向对象的编程语言,目前较为流行的有C++,JAVA,C#等。
D.面向对象的程序设计的雏形来自于Simula 语言,后来在SmallTalk 语言的完善和标准化的过程中得到更多的扩展和对以前思想的重新注解。至今,SmallTalk语言仍然被视为面向对象语言的基础
17.在32*32点阵的“字库”中,汉字“北”与“京”的字模占用字节数之和是()。
A.512B.256C.384D.128
18.设T 是一棵有n 个顶点的树,下列说法不正确的是()。
A.T有n 条边B.T是连通的C.T是无环的D.T有n-1条边
19.下列不属于NOIP 竞赛推荐使用的语言环境的是()。
A.Dev-C++B.VisualC++C.FreePascal D.Lazarus
20.在Pascal 程序中,表达式(200or 10)的值是()。
A.20B.1C.220D.202
二、问题求解(共2题,每题5分,共计10分)
1.书架上有4本不同的书A、B、C、D。其中A 和B 是红皮的,C和D 是黑皮的。把这4本书摆在书架上,满足所有黑皮的书都排在一起的摆法有_________种。满足A 必须比C 靠左,所有红皮的书要摆在一起,所有黑皮的书要摆放在一起,共有_________种摆法。
2.有6个城市,任何两个城市之间都有一条道路连接,6个城市两两之间的距离如下表所示,则城市1到城市6的最短距离为__________________。
城市1城市2城市3城市4城市5城市6
城市102311215
城市22025312
城市3320365
城市4153079
城市51236702
城市615125920
三、阅读程序写结果(共4题,每题8分,共计32分)
1.VARi,a,b,c,d:integer;
f:array[0..3]of integer;
BEGIN
for i:=0to 3do
read(f[i]);
a:=f[0]+f[1]+f[2]+f[3];
a:=adiv f[0];
b:=f[0]+f[2]+f[3];
b:=bdiv a;
c:=(b*f[1]+a)div f[2];
d:=f[(bdiv c) mod 4];
if (f[(a+b+c+d)mod 4]>f[2])then
begin
a:=a+b;
writeln(a);
end else
begin
c:=c+d;
writeln(c);
end;
END.
输入:9192939
输出:__________________________
2.procedurefoo(a,b,c:integer);
begin
if a>bthen foo(c,a,b)
else writeln(a,',',b,',',c);
end;
var
a,b,c:integer;
begin
read(a,b,c);
foo(a,b,c);
end.
输入:312
输出:_________________________
3.typeTT=array[0..20]ofinteger;
prodecure func(varary:TT;n:integer);
var i,j,x:integer;
begin
i:=0;j:=n-1;
while i
while (i0)do inc(i);
while (i
if i
ary[i]:=ary[j];
ary[j]:=x;
inc(i);
dec(j);
end;
end;
end;
var
a:TT;
i,m:integer;
begin
m:=10;
for i:=0to m-1do
read(a[i]);
func(a,m);
for i:=0
write(a,'
writeln;
end.
输入:54-6-116-5922-6110
输出:___________________________________________to m-1do ');
4.procedure
solve(first:string;spos_f,epos_f:integer;mid:string;spos_m,epos_m:integer);
var i,root_m:integer;
begin
if spos_f>epos_fthen exit;
for i:=spos_mto epos_mdo
if first[spos_f]=mid[i]then begin
root_m:=i;
break;
end;
solve(first,spos_f+1,spos_f+(root_m-spos_m),mid,spos_m,root_m-1);
solve(first,spos_f+(root_m-spos_m)+1,epos_f,mid,root_m+1,epos_m);
write(first[spos_f]);
end;
var first,mid:string;
len:integer;
begin
readln(len);
readln(first);
readln(mid);
solve(first,1,len,mid,1,len);
writeln;
end.
输入:7
ABDCEGF
BDAGECF
输出:_________________________________
四.完善程序(前四空,每空2.5分,后6空,每空3分,共28分)
1.(字符串替换)给定一个字符串S(S仅包含大小写字母),下面的程序将S 中的每个字母用规定的字母替换,并输出S 经过替换后的结果。程序的输入是两个字符串,第一个字符串是给定的字符串S,第二个字符串S’由26个字母组成,它是a~z的任一排列,大小写不定,S’规定了每个字母对应的替换字母:S’中的第一个字母是字母A 和a 的替换字母,即S 中的A 用该字母的大写替换,S中的a 用该字母的小写替换;S’中的第二个字母是字母B 和b 的替换字母,即S 中的B 用该字母的大写替换,S中的b 用该字母的小写替换;……以此类推。
Var change:string;
Str:string;
Procedure CheckChangeRule;
Var i:integer;
Begin
for i:=1to 26do begin
if ____①_____then
change[i]:=chr(ord(change[i])-ord('A')+ord('a'));
end;
end;
Procedure ChangeString;
Var len,i:integer;
begin
len:=length(str);
for i:=1to len do begin
if ______②______then
begin
str[i]:=upcase(change[ord(str[i]-ord('A')+1]);
end;
else
begin
_______④_______
end;
end;
end;
begin
readln(str);
readln(change);
CheckChangeRule;
_______⑤_______
writeln(str);
end.
2.(找第k 大的数)给定一个长度为1,000,000的无序正整数序列,以及另一个数n(1≤n≤1000000),然后以类似快速排序的方法找到序列中第n 大的数(关于第n 大的数:例如序列{1,2,3,4,5,6}中第3大的数是4。)
VAR a:array[1..1000000]of integer;
n,m,ans:integer;
Procedure swap(vara,b:integer);
var t:integer;
begin
if (ab)then begin
t:=a;a:=b;b:=t;
end;
end;
function FindKth(left,right,n:integer):integer;
var tmp,value,i,j:integer;
begin if left=rightthen exit(left);
tmp:=random(right-left)+left;
swap(a[tmp],a[left]);
value:=_____①______;
i:=left;j:=right;
while i
while (i
if i
a[i]:=a[j];inc(i);
end else break;
while (i
if i
a[j]:=a[i];dec(j);
end else break;
end;
______④_______
if i
if i>nthen begin dec(i);exit(_____⑥_____);end;
exit(i);
end;
var i:integer;
begin
randomize;
m:=1000000;
for i:=1to m do read(a[i]));
read(n);
ans:=FindKth(1,m,n);
writeln(a[ans]);
end.
NOIP2008年普及组(Pascal语言)参考答案与评分标准
一、单项选择题:(每题1.5分)
1. A 2. B 3. C 4. C 5. B
6. D 7. C 8. D 9. A 10. B
11. D 12. A 13. B 14. B 15. B
16. A 17. B 18. A 19. B 20. D
二、问题求解:(共2题,每题5分,共计10分)
1.124
2.7(1->2->5->6)
三、阅读程序写结果(共4题,每题8分,共计32分)
1. 23
2. 2,3,1
3. 54101622-59-6-11-6
4. DBGEFCA (求树的后序遍历)
四.完善程序(前4空,每空2.5分,后6空,每空3分,共28分)
(说明:以下各程序填空可能还有一些等价的写法,各省可请本省专家审定和上机验证,不一定上报科学委员会审查)
1. ①(change[i]>='A') and (change[i]='A') and (str[i]
③str[i]:=change[ord(str[i])-ord('a')+1];
④ChangeString;
2.①a[left]
②a[j]
③a[i]>value (或a[i]>=value)
④a[i]:=value;
⑤i,right,n
⑥FindKth(left,i, n)
复赛:
全国信息学奥林匹克联赛(NOIP2008)复赛
普及组
一.题目概览
中文题目名称ISBN 号码排座椅传球游戏立体图
英文题目名称isbn seat ball drawing
可执行文件名isbn seat ball drawing
输入文件名isbn.in seat.in ball.in drawing.in
输出文件名isbn.out seat.out ball.out drawing.out
每个测试点时限1秒1秒1秒1秒
测试点数目10101010
每个测试点分值10101010
比较方式全文比较全文比较全文比较全文比较
题目类型传统传统传统传统
二.提交源程序文件名
对于pascal 语言isbn.pas seat.pas ball.pas drawing.pas
对于C 语言isbn.c seat.c ball.c drawing.c
对于C++语言isbn.cpp seat.cpp ball.cpp drawing.cpp
三.编译命令(不包含任何优化开关)
对于pascal 语言fpc isbn.pas fpc seat.pas fpc ball.pas fpc drawing.pas
对于C 语言gcc –oisbn
isbn.c gcc –oseat
seat.c gcc –oball
ball.c gcc –odrawing
drawing.c
对于C++语言g++–oisbn
isbn.cpp g++–oseat
seat.cpp g++–oball
ball.cpp g++–o
drawing
drawing.cpp
四.运行内存限制
运行内存上限50M 50M 50M 50M
注意事项:
1、文件名(程序名和输入输出文件名)必须使用小写。
2、C/C++中函数main()的返回值类型必须是int,程序正常结束时的返回值必须是0。
3、全国统一评测时采用的机器配置为:CPU1.9GHz,内存512M,上述时限以此配置为准。各省在自测时可根据具体配置调整时限。
1.ISBN 号码
(isbn.pas/c/cpp)
【问题描述】
每一本正式出版的图书都有一个ISBN 号码与之对应,ISBN 码包括9位数字、1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN 码。ISBN码的首位数字表示书籍的出版语言,例如0代表英语;第一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社;第二个分隔之后的五位数字代表该书在出版社的编号;最后一位为识别码。
识别码的计算方法如下:
首位数字乘以1加上次位数字乘以2……以此类推,用所得的结果mod 11,所得的余数即为识别码,如果余数为10,则识别码为大写字母X。例如ISBN 号码0-670-82162-4中的识别码4是这样得到的:对067082162这9个数字,从左至右,分别乘以1,2,…,9,再求和,即0×1+6×2+……+2×9=158,然后取158mod 11的结果4作为识别码。
你的任务是编写程序判断输入的ISBN 号码中识别码是否正确,如果正确,则仅输出“Right”;如果错误,则输出你认为是正确的ISBN 号码。
【输入】
输入文件isbn.in 只有一行,是一个字符序列,表示一本书的ISBN 号码(保证输入符合ISBN 号码的格式要求)。
【输出】
输出文件isbn.out 共一行,假如输入的ISBN 号码的识别码正确,那么输出“Right”,否则,按照规定的格式,输出正确的ISBN 号码(包括分隔符“-”)。
【输入输出样例1】
isbn.in isbn.out
0-670-82162-4Right
【输入输出样例2】
isbn.in isbn.out
0-670-82162-00-670-82162-4
2.排座椅
(seat.pas/c/cpp)
【问题描述】
上课的时候总有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情。不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的D 对同学上课时会交头接耳。同学们在教室中坐成了M 行N 列,坐在第i 行第j 列
的同学的位置是(i,j),为了方便同学们进出,在教室中设置了K 条横向的通道,L条纵向的通道。于是,聪明的小雪想到了一个办法,或许可以减少上课时学生交头接耳的问题:她打算重新摆放桌椅,改变同学们桌椅间通道的位置,因为如果一条通道隔开了两个会交头接耳的同学,那么他们就不会交头接耳了。
请你帮忙给小雪编写一个程序,给出最好的通道划分方案。在该方案下,上课时交头接耳的学生对数最少。
【输入】
输入文件seat.in 的第一行,有5各用空格隔开的整数,分别是M,N,K,L,D(2
接下来D 行,每行有4个用空格隔开的整数,第i 行的4个整数Xi,Yi,Pi,Qi,表示坐在位置(Xi,Yi)与(Pi,Qi)的两个同学会交头接耳(输入保证他们前后相邻或者左右相邻)。
输入数据保证最优方案的唯一性。
【输出】
输出文件seat.out 共两行。
第一行包含K 个整数,a1a2……aK,表示第a1行和a1+1行之间、第a2行和第a2+1行之间、…、第aK 行和第aK+1行之间要开辟通道,其中ai
第二行包含L 个整数,b1b2……bk,表示第b1列和b1+1列之间、第b2列和第b2+1列之间、…、第bL 列和第bL+1列之间要开辟通道,其中bi
seat.in seat.out
45123
4243
2333
25242
24
【输入输出样例解释】
**
※
※++
12345
上图中用符号*、※、+标出了3对会交头接耳的学生的位置,图中3条粗线的位置表示通道,图示的通道划分方案是唯一的最佳方案。
3.传球游戏
(ball.pas/c/cpp)
【问题描述】
上体育课的时候,小蛮的老师经常带着同学们一起做游戏。这次,老师带着同学们一起做传球游戏。
游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同学可以把球传给自己左右的两个同学中的一个(左右任意),当老师再次吹哨子时,传球停止,此时,拿着球没传出去的那个同学就是败者,要给大家表演一个节目。
聪明的小蛮提出一个有趣的问题:有多少种不同的传球方法可以使得从小蛮手里开始传的球,传了m 次以后,又回到小蛮手里。两种传球的方法被视作不同的方法,当且仅当这两种方法中,接到球的同学按接球顺序组成的序列是不同的。比如有3个同学1号、2号、3号,并假设小蛮为1号,球传了3次回到小蛮手里的方式有1->2->3->1和1->3->2->1,共2种。
【输入】
输入文件ball.in 共一行,有两个用空格隔开的整数n,m(3
【输出】
输出文件ball.out 共一行,有一个整数,表示符合题意的方法数。
ball.in ball.out
332
【限制】
40%的数据满足:3
100%的数据满足:3
4.立体图
(drawing.pas/c/cpp)
【问题描述】
小渊是个聪明的孩子,他经常会给周围的小朋友们讲些自己认为有趣的内容。最近,他准备给小朋友们讲解立体图,请你帮他画出立体图。
小渊有一块面积为m*n的矩形区域,上面有m*n个边长为1的格子,每个格子上堆了一些同样大小的吉姆(积木的长宽高都是1),小渊想请你打印出这些格子的立体图。我们定义每个积木为如下格式,并且不会做任何翻转旋转,只会严格以这一种形式摆放:
+---+
//|高
+---+|
||+
||/宽
+---+
长
每个顶点用1个加号’+’表示,长用3个”-“表示,宽用1个”/”表示,高用两个”|”表示。字符’+’‘-‘’/’‘|’的ASCII 码分别为43,45,47,124。字符’.’(ASCII码46)需要作为背景输出,即立体图里的空白部分需要用’.’代替。立体图的画法如下面的规则:若两块积木左右相邻,图示为:
..+---+---+
.///|
+---+---+|
|||+
|||/.
+---+---+..
若两块积木上下相邻,图示为:
..+---+
.//|
+---+|
||+
||/|
+---+|
||+
||/.
+---+..
若两块积木前后相邻,图示为:
….+---+
…//|
..+---+|
.//|+
+---+|/.
||+..
||/…
+---+….
立体图中,定义位于第(m,1)的格子(即第m 行第1列的格子)上面自底向上的第一块积木(即最下面的一块积木)的左下角顶点为整张图最左下角的点。
【输入】
输入文件drawing.in 第一行有用空格隔开的两个整数m 和n,表示有m*n个格子(1
【输出】
输出文件drawing.out 中包含题目要求的立体图,是一个K 行L 列的字符矩阵,其中K 和L 表示最少需要K 行L 列才能按规定输出立体图。
【输入输出样例】
drawing.in drawing.out 34
2212
2211
3212
......+---+---+...+---+..+---+//|..//|.//|-+---+|.+---+|+---+|//|+-||+||+---+|/+---+|/|||//|+//|-+|
+---+---+|/+---+|/|+|||+-||+|/.|||/||/|+..
+---+---+---+---+|/...|||||+....|||||/.....
+---+---+---+---+......
第十四届全国青少年信息学奥林匹克联赛初赛试题
(普及组Pascal 语言二小时完成)
●●全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效●●
一、单项选择题(共20题,每题1.5分。每题有且仅有一个正确答案。)
1.微型计算机中,控制器的基本功能是()。
A.控制机器各个部件协调工作B.实现算术运算和逻辑运算
C.获取外部信息D.存放程序和数据
2.设A=True,B=False,C=True,D=False,以下逻辑运算表达式值为真的是()。
A.(A∧B)∨(C∧D∨﹁A)B.((﹁A∧B)∨C)∧﹁D
C.(B∨C∨D)∧D∧AD.A∧(D∨﹁C)∧B
3.在下列关于图灵奖的说法中,不正确的是()。
A.图灵奖是美国计算机协会于1966年设立的,专门奖励那些对计算机事业作出重要贡献的个人
B.图灵奖有“计算机界诺贝尔奖”之称
C.迄今为止,还没有华裔计算机科学家获此殊荣
D.图灵奖的名称取自计算机科学的先驱、英国科学家阿兰•图灵
4.计算机在工作过程中,若突然停电,()中的信息不会丢失。
A.ROM和RAM B.CPUC.ROMD.RAM
5.完全二叉树共有2*N-1个结点,则它的叶节点数是()。
A.N-1B.NC.2*ND.2N-1
6.在以下各项中,()不是操作系统软件。
A.SolarisB.LinuxC.WindowsVista D.Sybase
7.设栈S 的初始状态为空,元素a,b,c,d,e,f依次入栈S,出栈的序列为b,d,f,e,c,a,则栈S 的容量至少应该是()。
A.6B.5C.4D.3
8.与十进制数28.5625相等的四进制数是()。
A.123.21B.131.22C.130.22D.130.21
9.设字符串S=”Olympic”,S的非字串的数目是()。
A.28B.29C.16D.17
10.Web2.0是近年来互联网的热门概念之一,其核心思想是互动与分享。下列网站中,()是典型的Web 2.0应用。
A.SinaB.FlickerC.YahooD.Google
11.递归过程或函数调用时,处理参数和返回地址,通常使用一种称为()的数据结构。
A.队列B.多维数组C.线性表D.栈
12.(2008)10+(5B)16的结果是()。
A.(833)16B.(2089)10C.(4163)8D.([1**********]1)2
13.二叉树T,已知其先根遍历是1243576(数字为节点的编号,下同),中根遍历2415736,则该二叉树的后根遍历是()。
A.4257631B.4275631C.7425631D.4276531
14.将数组{8,23,4,16,77,-5,53,100}中的元素按从小到大的顺序排列,每次可以交换任意两个元素,最少需要交换()次。
A.4B.5C.6D.7
15.对有序数组{5,13,19,21,37,56,64,75,88,92,100}进行二分查找,成功查找元素19的查找长度(比较次数)是()。
A.1B.2C.3D.4
16.面向对象程序设计(Object-OrientedProgramming)是一种程序设计的方法论,它将对象作为程序的基本单元,将数据和程序封装在对象中,以提高软件的重用性、灵活性和扩展性。下面关于面向对象设计的说法中,不正确的是()
A.面向对象程序设计通常采用自顶向下设计方法进行设计。
B.面向对象程序设计方法具有继承性(inheritance)、封装性(encapsulation)、多态性(polymorphism)等几大特点。
C.支持面向对象特性的语言称为面向对象的编程语言,目前较为流行的有C++,JAVA,C#等。
D.面向对象的程序设计的雏形来自于Simula 语言,后来在SmallTalk 语言的完善和标准化的过程中得到更多的扩展和对以前思想的重新注解。至今,SmallTalk语言仍然被视为面向对象语言的基础
17.在32*32点阵的“字库”中,汉字“北”与“京”的字模占用字节数之和是()。
A.512B.256C.384D.128
18.设T 是一棵有n 个顶点的树,下列说法不正确的是()。
A.T有n 条边B.T是连通的C.T是无环的D.T有n-1条边
19.下列不属于NOIP 竞赛推荐使用的语言环境的是()。
A.Dev-C++B.VisualC++C.FreePascal D.Lazarus
20.在Pascal 程序中,表达式(200or 10)的值是()。
A.20B.1C.220D.202
二、问题求解(共2题,每题5分,共计10分)
1.书架上有4本不同的书A、B、C、D。其中A 和B 是红皮的,C和D 是黑皮的。把这4本书摆在书架上,满足所有黑皮的书都排在一起的摆法有_________种。满足A 必须比C 靠左,所有红皮的书要摆在一起,所有黑皮的书要摆放在一起,共有_________种摆法。
2.有6个城市,任何两个城市之间都有一条道路连接,6个城市两两之间的距离如下表所示,则城市1到城市6的最短距离为__________________。
城市1城市2城市3城市4城市5城市6
城市102311215
城市22025312
城市3320365
城市4153079
城市51236702
城市615125920
三、阅读程序写结果(共4题,每题8分,共计32分)
1.VARi,a,b,c,d:integer;
f:array[0..3]of integer;
BEGIN
for i:=0to 3do
read(f[i]);
a:=f[0]+f[1]+f[2]+f[3];
a:=adiv f[0];
b:=f[0]+f[2]+f[3];
b:=bdiv a;
c:=(b*f[1]+a)div f[2];
d:=f[(bdiv c) mod 4];
if (f[(a+b+c+d)mod 4]>f[2])then
begin
a:=a+b;
writeln(a);
end else
begin
c:=c+d;
writeln(c);
end;
END.
输入:9192939
输出:__________________________
2.procedurefoo(a,b,c:integer);
begin
if a>bthen foo(c,a,b)
else writeln(a,',',b,',',c);
end;
var
a,b,c:integer;
begin
read(a,b,c);
foo(a,b,c);
end.
输入:312
输出:_________________________
3.typeTT=array[0..20]ofinteger;
prodecure func(varary:TT;n:integer);
var i,j,x:integer;
begin
i:=0;j:=n-1;
while i
while (i0)do inc(i);
while (i
if i
ary[i]:=ary[j];
ary[j]:=x;
inc(i);
dec(j);
end;
end;
end;
var
a:TT;
i,m:integer;
begin
m:=10;
for i:=0to m-1do
read(a[i]);
func(a,m);
for i:=0
write(a,'
writeln;
end.
输入:54-6-116-5922-6110
输出:___________________________________________to m-1do ');
4.procedure
solve(first:string;spos_f,epos_f:integer;mid:string;spos_m,epos_m:integer);
var i,root_m:integer;
begin
if spos_f>epos_fthen exit;
for i:=spos_mto epos_mdo
if first[spos_f]=mid[i]then begin
root_m:=i;
break;
end;
solve(first,spos_f+1,spos_f+(root_m-spos_m),mid,spos_m,root_m-1);
solve(first,spos_f+(root_m-spos_m)+1,epos_f,mid,root_m+1,epos_m);
write(first[spos_f]);
end;
var first,mid:string;
len:integer;
begin
readln(len);
readln(first);
readln(mid);
solve(first,1,len,mid,1,len);
writeln;
end.
输入:7
ABDCEGF
BDAGECF
输出:_________________________________
四.完善程序(前四空,每空2.5分,后6空,每空3分,共28分)
1.(字符串替换)给定一个字符串S(S仅包含大小写字母),下面的程序将S 中的每个字母用规定的字母替换,并输出S 经过替换后的结果。程序的输入是两个字符串,第一个字符串是给定的字符串S,第二个字符串S’由26个字母组成,它是a~z的任一排列,大小写不定,S’规定了每个字母对应的替换字母:S’中的第一个字母是字母A 和a 的替换字母,即S 中的A 用该字母的大写替换,S中的a 用该字母的小写替换;S’中的第二个字母是字母B 和b 的替换字母,即S 中的B 用该字母的大写替换,S中的b 用该字母的小写替换;……以此类推。
Var change:string;
Str:string;
Procedure CheckChangeRule;
Var i:integer;
Begin
for i:=1to 26do begin
if ____①_____then
change[i]:=chr(ord(change[i])-ord('A')+ord('a'));
end;
end;
Procedure ChangeString;
Var len,i:integer;
begin
len:=length(str);
for i:=1to len do begin
if ______②______then
begin
str[i]:=upcase(change[ord(str[i]-ord('A')+1]);
end;
else
begin
_______④_______
end;
end;
end;
begin
readln(str);
readln(change);
CheckChangeRule;
_______⑤_______
writeln(str);
end.
2.(找第k 大的数)给定一个长度为1,000,000的无序正整数序列,以及另一个数n(1≤n≤1000000),然后以类似快速排序的方法找到序列中第n 大的数(关于第n 大的数:例如序列{1,2,3,4,5,6}中第3大的数是4。)
VAR a:array[1..1000000]of integer;
n,m,ans:integer;
Procedure swap(vara,b:integer);
var t:integer;
begin
if (ab)then begin
t:=a;a:=b;b:=t;
end;
end;
function FindKth(left,right,n:integer):integer;
var tmp,value,i,j:integer;
begin if left=rightthen exit(left);
tmp:=random(right-left)+left;
swap(a[tmp],a[left]);
value:=_____①______;
i:=left;j:=right;
while i
while (i
if i
a[i]:=a[j];inc(i);
end else break;
while (i
if i
a[j]:=a[i];dec(j);
end else break;
end;
______④_______
if i
if i>nthen begin dec(i);exit(_____⑥_____);end;
exit(i);
end;
var i:integer;
begin
randomize;
m:=1000000;
for i:=1to m do read(a[i]));
read(n);
ans:=FindKth(1,m,n);
writeln(a[ans]);
end.
NOIP2008年普及组(Pascal语言)参考答案与评分标准
一、单项选择题:(每题1.5分)
1. A 2. B 3. C 4. C 5. B
6. D 7. C 8. D 9. A 10. B
11. D 12. A 13. B 14. B 15. B
16. A 17. B 18. A 19. B 20. D
二、问题求解:(共2题,每题5分,共计10分)
1.124
2.7(1->2->5->6)
三、阅读程序写结果(共4题,每题8分,共计32分)
1. 23
2. 2,3,1
3. 54101622-59-6-11-6
4. DBGEFCA (求树的后序遍历)
四.完善程序(前4空,每空2.5分,后6空,每空3分,共28分)
(说明:以下各程序填空可能还有一些等价的写法,各省可请本省专家审定和上机验证,不一定上报科学委员会审查)
1. ①(change[i]>='A') and (change[i]='A') and (str[i]
③str[i]:=change[ord(str[i])-ord('a')+1];
④ChangeString;
2.①a[left]
②a[j]
③a[i]>value (或a[i]>=value)
④a[i]:=value;
⑤i,right,n
⑥FindKth(left,i, n)
复赛:
全国信息学奥林匹克联赛(NOIP2008)复赛
普及组
一.题目概览
中文题目名称ISBN 号码排座椅传球游戏立体图
英文题目名称isbn seat ball drawing
可执行文件名isbn seat ball drawing
输入文件名isbn.in seat.in ball.in drawing.in
输出文件名isbn.out seat.out ball.out drawing.out
每个测试点时限1秒1秒1秒1秒
测试点数目10101010
每个测试点分值10101010
比较方式全文比较全文比较全文比较全文比较
题目类型传统传统传统传统
二.提交源程序文件名
对于pascal 语言isbn.pas seat.pas ball.pas drawing.pas
对于C 语言isbn.c seat.c ball.c drawing.c
对于C++语言isbn.cpp seat.cpp ball.cpp drawing.cpp
三.编译命令(不包含任何优化开关)
对于pascal 语言fpc isbn.pas fpc seat.pas fpc ball.pas fpc drawing.pas
对于C 语言gcc –oisbn
isbn.c gcc –oseat
seat.c gcc –oball
ball.c gcc –odrawing
drawing.c
对于C++语言g++–oisbn
isbn.cpp g++–oseat
seat.cpp g++–oball
ball.cpp g++–o
drawing
drawing.cpp
四.运行内存限制
运行内存上限50M 50M 50M 50M
注意事项:
1、文件名(程序名和输入输出文件名)必须使用小写。
2、C/C++中函数main()的返回值类型必须是int,程序正常结束时的返回值必须是0。
3、全国统一评测时采用的机器配置为:CPU1.9GHz,内存512M,上述时限以此配置为准。各省在自测时可根据具体配置调整时限。
1.ISBN 号码
(isbn.pas/c/cpp)
【问题描述】
每一本正式出版的图书都有一个ISBN 号码与之对应,ISBN 码包括9位数字、1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN 码。ISBN码的首位数字表示书籍的出版语言,例如0代表英语;第一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社;第二个分隔之后的五位数字代表该书在出版社的编号;最后一位为识别码。
识别码的计算方法如下:
首位数字乘以1加上次位数字乘以2……以此类推,用所得的结果mod 11,所得的余数即为识别码,如果余数为10,则识别码为大写字母X。例如ISBN 号码0-670-82162-4中的识别码4是这样得到的:对067082162这9个数字,从左至右,分别乘以1,2,…,9,再求和,即0×1+6×2+……+2×9=158,然后取158mod 11的结果4作为识别码。
你的任务是编写程序判断输入的ISBN 号码中识别码是否正确,如果正确,则仅输出“Right”;如果错误,则输出你认为是正确的ISBN 号码。
【输入】
输入文件isbn.in 只有一行,是一个字符序列,表示一本书的ISBN 号码(保证输入符合ISBN 号码的格式要求)。
【输出】
输出文件isbn.out 共一行,假如输入的ISBN 号码的识别码正确,那么输出“Right”,否则,按照规定的格式,输出正确的ISBN 号码(包括分隔符“-”)。
【输入输出样例1】
isbn.in isbn.out
0-670-82162-4Right
【输入输出样例2】
isbn.in isbn.out
0-670-82162-00-670-82162-4
2.排座椅
(seat.pas/c/cpp)
【问题描述】
上课的时候总有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情。不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的D 对同学上课时会交头接耳。同学们在教室中坐成了M 行N 列,坐在第i 行第j 列
的同学的位置是(i,j),为了方便同学们进出,在教室中设置了K 条横向的通道,L条纵向的通道。于是,聪明的小雪想到了一个办法,或许可以减少上课时学生交头接耳的问题:她打算重新摆放桌椅,改变同学们桌椅间通道的位置,因为如果一条通道隔开了两个会交头接耳的同学,那么他们就不会交头接耳了。
请你帮忙给小雪编写一个程序,给出最好的通道划分方案。在该方案下,上课时交头接耳的学生对数最少。
【输入】
输入文件seat.in 的第一行,有5各用空格隔开的整数,分别是M,N,K,L,D(2
接下来D 行,每行有4个用空格隔开的整数,第i 行的4个整数Xi,Yi,Pi,Qi,表示坐在位置(Xi,Yi)与(Pi,Qi)的两个同学会交头接耳(输入保证他们前后相邻或者左右相邻)。
输入数据保证最优方案的唯一性。
【输出】
输出文件seat.out 共两行。
第一行包含K 个整数,a1a2……aK,表示第a1行和a1+1行之间、第a2行和第a2+1行之间、…、第aK 行和第aK+1行之间要开辟通道,其中ai
第二行包含L 个整数,b1b2……bk,表示第b1列和b1+1列之间、第b2列和第b2+1列之间、…、第bL 列和第bL+1列之间要开辟通道,其中bi
seat.in seat.out
45123
4243
2333
25242
24
【输入输出样例解释】
**
※
※++
12345
上图中用符号*、※、+标出了3对会交头接耳的学生的位置,图中3条粗线的位置表示通道,图示的通道划分方案是唯一的最佳方案。
3.传球游戏
(ball.pas/c/cpp)
【问题描述】
上体育课的时候,小蛮的老师经常带着同学们一起做游戏。这次,老师带着同学们一起做传球游戏。
游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同学可以把球传给自己左右的两个同学中的一个(左右任意),当老师再次吹哨子时,传球停止,此时,拿着球没传出去的那个同学就是败者,要给大家表演一个节目。
聪明的小蛮提出一个有趣的问题:有多少种不同的传球方法可以使得从小蛮手里开始传的球,传了m 次以后,又回到小蛮手里。两种传球的方法被视作不同的方法,当且仅当这两种方法中,接到球的同学按接球顺序组成的序列是不同的。比如有3个同学1号、2号、3号,并假设小蛮为1号,球传了3次回到小蛮手里的方式有1->2->3->1和1->3->2->1,共2种。
【输入】
输入文件ball.in 共一行,有两个用空格隔开的整数n,m(3
【输出】
输出文件ball.out 共一行,有一个整数,表示符合题意的方法数。
ball.in ball.out
332
【限制】
40%的数据满足:3
100%的数据满足:3
4.立体图
(drawing.pas/c/cpp)
【问题描述】
小渊是个聪明的孩子,他经常会给周围的小朋友们讲些自己认为有趣的内容。最近,他准备给小朋友们讲解立体图,请你帮他画出立体图。
小渊有一块面积为m*n的矩形区域,上面有m*n个边长为1的格子,每个格子上堆了一些同样大小的吉姆(积木的长宽高都是1),小渊想请你打印出这些格子的立体图。我们定义每个积木为如下格式,并且不会做任何翻转旋转,只会严格以这一种形式摆放:
+---+
//|高
+---+|
||+
||/宽
+---+
长
每个顶点用1个加号’+’表示,长用3个”-“表示,宽用1个”/”表示,高用两个”|”表示。字符’+’‘-‘’/’‘|’的ASCII 码分别为43,45,47,124。字符’.’(ASCII码46)需要作为背景输出,即立体图里的空白部分需要用’.’代替。立体图的画法如下面的规则:若两块积木左右相邻,图示为:
..+---+---+
.///|
+---+---+|
|||+
|||/.
+---+---+..
若两块积木上下相邻,图示为:
..+---+
.//|
+---+|
||+
||/|
+---+|
||+
||/.
+---+..
若两块积木前后相邻,图示为:
….+---+
…//|
..+---+|
.//|+
+---+|/.
||+..
||/…
+---+….
立体图中,定义位于第(m,1)的格子(即第m 行第1列的格子)上面自底向上的第一块积木(即最下面的一块积木)的左下角顶点为整张图最左下角的点。
【输入】
输入文件drawing.in 第一行有用空格隔开的两个整数m 和n,表示有m*n个格子(1
【输出】
输出文件drawing.out 中包含题目要求的立体图,是一个K 行L 列的字符矩阵,其中K 和L 表示最少需要K 行L 列才能按规定输出立体图。
【输入输出样例】
drawing.in drawing.out 34
2212
2211
3212
......+---+---+...+---+..+---+//|..//|.//|-+---+|.+---+|+---+|//|+-||+||+---+|/+---+|/|||//|+//|-+|
+---+---+|/+---+|/|+|||+-||+|/.|||/||/|+..
+---+---+---+---+|/...|||||+....|||||/.....
+---+---+---+---+......