pascalnoip历届精选试题.docx
- 文档编号:25413973
- 上传时间:2023-06-08
- 格式:DOCX
- 页数:37
- 大小:95.27KB
pascalnoip历届精选试题.docx
《pascalnoip历届精选试题.docx》由会员分享,可在线阅读,更多相关《pascalnoip历届精选试题.docx(37页珍藏版)》请在冰豆网上搜索。
pascalnoip历届精选试题
第1题花生采摘2004年试题第2题
peanuts.pas
【问题描述】
鲁宾逊先生有一只宠物猴,名叫多多。
这天,他们两个正沿着乡间小路散步,突然发现路边的告示牌上贴着一张小小的纸条:
“欢迎免费品尝我种的花生!
——熊字”。
鲁宾逊先生和多多都很开心,因为花生正是他们的最爱。
在告示牌背后,路边真的有一块花生田,花生植株整齐地排列成矩形网格(如图1)。
有经验的多多一眼就能看出,每棵花生植株下的花生有多少。
为了训练多多的算术,鲁宾逊先生说:
“你先找出花生最多的植株,去采摘它的花生;然后再找出剩下的植株里花生最多的,去采摘它的花生;依此类推,不过你一定要在我限定的时间内回到路边。
”
我们假定多多在每个单位时间内,可以做下列四件事情中的一件:
1)从路边跳到最靠近路边(即第一行)的某棵花生植株;
2)从一棵植株跳到前后左右与之相邻的另一棵植株;
3)采摘一棵植株下的花生;
4)从最靠近路边(即第一行)的某棵花生植株跳回路边。
现在给定一块花生田的大小和花生的分布,请问在限定时间内,多多最多可以采到多少个花生?
注意可能只有部分植株下面长有花生,假设这些植株下的花生个数各不相同。
例如在图2所示的花生田里,只有位于(2,5),(3,7),(4,2),(5,4)的植株下长有花生,个数分别为13,7,15,9。
沿着图示的路线,多多在21个单位时间内,最多可以采到37个花生。
【输入文件】
输入文件peanuts.in的第一行包括三个整数,M,N和K,用空格隔开;表示花生田的大小为M*N(1<=M,N<=20),多多采花生的限定时间为K(0<=K<=1000)个单位时间。
接下来的M行,每行包括N个非负整数,也用空格隔开;第i+1行的第j个整数Pij(0<=Pij<=500)表示花生田里植株(i,j)下花生的数目,0表示该植株下没有花生。
【输出文件】
输出文件peanuts.out包括一行,这一行只包含一个整数,即在限定时间内,多多最多可以采到花生的个数。
【样例输入1】
6721
0000000
00001300
0000007
01500000
0009000
0000000
【样例输出1】
37
【样例输入2】
6720
0000000
00001300
0000007
01500000
0009000
0000000
【样例输出2】
28
第2题FBI树2004年试题第3题
fbi.pas
【问题描述】
我们可以把由“0”和“1”组成的字符串分为三类:
全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串。
FBI树是一种二叉树[1],它的结点类型也包括F结点,B结点和I结点三种。
由一个长度为2N的“01”串S可以构造出一棵FBI树T,递归的构造方法如下:
1)T的根结点为R,其类型与串S的类型相同;
2)若串S的长度大于1,将串S从中间分开,分为等长的左右子串S1和S2;由左子串S1构造R的左子树T1,由右子串S2构造R的右子树T2。
现在给定一个长度为2N的“01”串,请用上述构造方法构造出一棵FBI树,并输出它的后序遍历[2]序列。
【输入文件】
输入文件fbi.in的第一行是一个整数N(0<=N<=10),第二行是一个长度为2N的“01”串。
【输出文件】
输出文件fbi.out包括一行,这一行只包含一个字符串,即FBI树的后序遍历序列。
【样例输入】
3
10001011
【样例输出】
IBFBBBFIBFIIIFF
【数据规模】
对于40%的数据,N<=2;
对于全部的数据,N<=10。
第3题火星人2004年试题第4题
martian.pas
【问题描述】
人类终于登上了火星的土地并且见到了神秘的火星人。
人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法。
这种交流方法是这样的,首先,火星人把一个非常大的数字告诉人类科学家,科学家破解这个数字的含义后,再把一个很小的数字加到这个大数上面,把结果告诉火星人,作为人类的回答。
火星人用一种非常简单的方式来表示数字——掰手指。
火星人只有一只手,但这只手上有成千上万的手指,这些手指排成一列,分别编号为1,2,3……。
火星人的任意两根手指都能随意交换位置,他们就是通过这方法计数的。
一个火星人用一个人类的手演示了如何用手指计数。
如果把五根手指——拇指、食指、中指、无名指和小指分别编号为1,2,3,4和5,当它们按正常顺序排列时,形成了5位数12345,当你交换无名指和小指的位置时,会形成5位数12354,当你把五个手指的顺序完全颠倒时,会形成54321,在所有能够形成的120个5位数中,12345最小,它表示1;12354第二小,它表示2;54321最大,它表示120。
下表展示了只有3根手指时能够形成的6个3位数和它们代表的数字:
三进制数
123
132
213
231
312
321
代表的数字
1
2
3
4
5
6
现在你有幸成为了第一个和火星人交流的地球人。
一个火星人会让你看他的手指,科学家会告诉你要加上去的很小的数。
你的任务是,把火星人用手指表示的数与科学家告诉你的数相加,并根据相加的结果改变火星人手指的排列顺序。
输入数据保证这个结果不会超出火星人手指能表示的范围。
【输入文件】
输入文件martian.in包括三行,第一行有一个正整数N,表示火星人手指的数目(1<=N<=10000)。
第二行是一个正整数M,表示要加上去的小整数(1<=M<=100)。
下一行是1到N这N个整数的一个排列,用空格隔开,表示火星人手指的排列顺序。
【输出文件】
输出文件martian.out只有一行,这一行含有N个整数,表示改变后的火星人手指的排列顺序。
每两个相邻的数中间用一个空格分开,不能有多余的空格。
【样例输入】
5
3
12345
【样例输出】
12453
【数据规模】
对于30%的数据,N<=15;
对于60%的数据,N<=50;
对于全部的数据,N<=10000;
第4题Jam的计数法(2006年第3题)
count.pas
【问题描述】
Jam是个喜欢标新立异的科学怪人。
他不使用阿拉伯数字计数,而是使用小写英文字母计数,他觉得这样做,会使世界更加丰富多彩。
在他的计数法中,每个数字的位数都是相同的(使用相同个数的字母),英文字母按原先的顺序,排在前面的字母小于排在它后面的字母。
我们把这样的“数字”称为Jam数字。
在Jam数字中,每个字母互不相同,而且从左到右是严格递增的。
每次,Jam还指定使用字母的范围,例如,从2到10,表示只能使用{b,c,d,e,f,g,h,i,j}这些字母。
如果再规定位数为5,那么,紧接在Jam数字“bdfij”之后的数字应该是“bdghi”。
(如果我们用U、V依次表示Jam数字“bdfij”与“bdghi”,则U )。 你的任务是: 对于从文件读入的一个Jam数字,按顺序输出紧接在后面的5个Jam数字,如果后面没有那么多Jam数字,那么有几个就输出几个。 【输入文件】 输入文件counting.in有2行,第1行为3个正整数,用一个空格隔开: stw (其中s为所使用的最小的字母的序号,t为所使用的最大的字母的序号。 w为数字的位数,这3个数满足: 1≤s 第2行为具有w个小写字母的字符串,为一个符合要求的Jam数字。 所给的数据都是正确的,不必验证。 【输出文件】 输出文件counting.out最多为5行,为紧接在输入的Jam数字后面的5个Jam数字,如果后面没有那么多Jam数字,那么有几个就输出几个。 每行只输出一个Jam数字,是由w个小写字母组成的字符串,不要有多余的空格。 【输入样例】 2105 bdfij 【输出样例】 bdghi bdghj bdgij bdhij befgh 第5题.守望者的逃离2007年第3题 escape.pas 【问题描述】 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变。 守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上。 为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很快就会沉下去。 到那时,岛上的所有人都会遇难。 守望者的跑步速度为17m/s,以这样的速度是无法逃离荒岛的。 庆幸的是守望者拥有闪烁法术,可在1s内移动60m,不过每次使用闪烁法术都会消耗魔法值10点。 守望者的魔法值恢复的速度为4点/s,只有处在原地休息状态时才能恢复。 现在已知守望者的魔法初值M,他所在的初始位置与岛的出口之间的距离S,岛沉没的时间T。 你的任务是写一个程序帮助守望者计算如何在最短的时间内逃离荒岛,若不能逃出,则输出守望者在剩下的时间内能走的最远距离。 注意: 守望者跑步、闪烁或休息活动均以秒(s)为单位,且每次活动的持续时间为整数秒。 距离的单位为米(m)。 【输入】 输入文件escape.in仅一行,包括空格隔开的三个非负整数M,S,T。 【输出】 输出文件escape.out包含两行: 第1行为字符串“Yes”或“No”(区分大小写),即守望者是否能逃离荒岛。 第2行包含一个整数。 第一行为“Yes”(区分大小写)时表示守望者逃离荒岛的最短时间;第一行为“No”(区分大小写)时表示守望者能走的最远距离。 【输入输出样例1】 escape.in392004 escape.out No 197 【输入输出样例2】 escape.in 3625510 escape.out Yes 6 【限制】 30%的数据满足: 1<=T<=10,1<=S<=100 50%的数据满足: 1<=T<=1000,1<=S<=10000 100%的数据满足: 1<=T<=300000,0<=M<=1000,1<=S<=108. 第6题Hanoi双塔问题.2007年第4题 hanoi.pas 【问题描述】 给定A、B、C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3的情形)。 现要将这些圆盘移到C柱上,在移动过程中可放在B柱上暂存。 要求: (1)每次只能移动一个圆盘; (2)A、B、C三根细柱上的圆盘都要保持上小下大的顺序; 任务: 设An为2n个圆盘完成上述任务所需的最少移动次数,对于输入的n,输出An。 【输入】 输入文件hanoi.in为一个正整数n,表示在A柱上放有2n个圆盘。 【输出】 输出文件hanoi.out仅一行,包含一个正整数,为完成上述任务所需的最少移动次数An。 【输入输出样例1】 hanoi.inhanoi.out 12 【输入输出样例2】 hanoi.inhanoi.out 26 【限制】 对于50%的数据,1<=n<=25 对于100%的数据,1<=n<=200 【提示】 设法建立An与An-1的递推关系式。 第7题排座椅2008年第2题 seat.pas 【问题描述】 上课的时候总有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情。 不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的D对同学上课时会交头接耳。 同学们在教室中坐成了M行N列,坐在第i行第j列的同学的位置是(i,j),为了方便同学们进出,在教室中设置了K条横向的通道,L条纵向的通道。 于是,聪明的小雪想到了一个办法,或许可以减少上课时学生交头接耳的问题: 她打算重新摆放桌椅,改变同学们桌椅间通道的位置,因为如果一条通道隔开了两个会交头接耳的同学,那么他们就不会交头接耳了。 请你帮忙给小雪编写一个程序,给出最好的通道划分方案。 在该方案下,上课时交头接耳的学生对数最少。 【输入】 输入文件seat.in的第一行,有5各用空格隔开的整数,分别是M,N,K,L,D(2<=N,M<=1000,0<=K 接下来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.inseat.out 45123 4243 2333 25242 24 【输入输出样例解释】 ** ※ ※++ 12345 上图中用符号*、※、+标出了3对会交头接耳的学生的位置,图中3条粗线的位置表示通道,图示的通道划分方案是唯一的最佳方案。 第8题传球游戏2008年第3题 ball.pas 【问题描述】 上体育课的时候,小蛮的老师经常带着同学们一起做游戏。 这次,老师带着同学们一起做传球游戏。 游戏规则是这样的: n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同学可以把球传给自己左右的两个同学中的一个(左右任意),当老师再次吹哨子时,传球停止,此时,拿着球没传出去的那个同学就是败者,要给大家表演一个节目。 聪明的小蛮提出一个有趣的问题: 有多少种不同的传球方法可以使得从小蛮手里开始传的球,传了m次以后,又回到小蛮手里。 两种传球的方法被视作不同的方法,当且仅当这两种方法中,接到球的同学按接球顺序组成的序列是不同的。 比如有3个同学1号、2号、3号,并假设小蛮为1号,球传了3次回到小蛮手里的方式有1->2->3->1和1->3->2->1,共2种。 【输入】 输入文件ball.in共一行,有两个用空格隔开的整数n,m(3<=n<=30,1<=m<=30)。 【输出】 输出文件ball.out共一行,有一个整数,表示符合题意的方法数。 【输入输出样例】 ball.inball.out 332 【限制】 40%的数据满足: 3<=n<=30,1<=m<=20 100%的数据满足: 3<=n<=30,1<=m<=30 第9题立体图2008年第4题 drawing.pas 【问题描述】 小渊是个聪明的孩子,他经常会给周围的小朋友们讲些自己认为有趣的内容。 最近,他准备给小朋友们讲解立体图,请你帮他画出立体图。 小渊有一块面积为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<=m,n<=50)。 接下来的m行,是一个m*n的矩阵,每行有n个用空格隔开的整数,其中第i行第j列上的整数表示第i行第j列的格子上摞有多少个积木(1<=每个格子上的积木数<=100)。 【输出】 输出文件drawing.out中包含题目要求的立体图,是一个K行L列的字符矩阵,其中K和L表示最少需要K行L列才能按规定输出立体图。 【输入输出样例】 drawing.in drawing.out 34 2212 2211 3212 ......+---+---+...+---+ ..+---+//|..//| .//|-+---+|.+---+| +---+|//|+-||+ ||+---+|/+---+|/| ||//|+//|-+| +---+---+|/+---+|/|+ |||+-||+|/. |||/||/|+.. +---+---+---+---+|/... |||||+.... |||||/..... +---+---+---+---+...... 第10题分数线划定2009年第2题 (score.pas/c/cpp) 【问题描述】 世博会志愿者的选拔工作正在A市如火如荼的进行。 为了选拔最合适的人才,A市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试。 面试分数线根据计划录取人数的150%划定,即如果计划录取m名志愿者,则面试分数线为排名第m*150%(向下取整)名的选手的分数,而最终进入面试的选手为笔试成绩不低于面试分数线的所有选手。 现在就请你编写程序划定面试分数线,并输出所有进入面试的选手的报名号和笔试成绩。 【输入】 输入文件名为score.in。 第一行,两个整数n,m(5≤n≤5000,3≤m≤n),中间用一个空格隔开,其中n表示报名参加笔试的选手总数,m表示计划录取的志愿者人数。 输入数据保证m*150%向下取整后小于等于n。 第二行到第n+1行,每行包括两个整数,中间用一个空格隔开,分别是选手的报名号k(1000≤k≤9999)和该选手的笔试成绩s(1≤s≤100)。 数据保证选手的报名号各不相同。 【输出】 输出文件score.out。 第一行,有两个整数,用一个空格隔开,第一个整数表示面试分数线;第二个整数为进入面试的选手的实际人数。 从第二行开始,每行包含两个整数,中间用一个空格隔开,分别表示进入面试的选手的报名号和笔试成绩,按照笔试成绩从高到低输出,如果成绩相同,则按报名号由小到大的 顺序输出。 【输入输出样例】 score.inscore.out 63 100090 323988 239095 723184 100595 100188 885 100595 239095 100090 100188 323988 【样例说明】 m*150%=3*150%=4.5,向下取整后为4。 保证4个人进入面试的分数线为88,但因为88有重分,所以所有成绩大于等于88的选手都可以进入面试,故最终有5个人进入面试。 第11题细胞分裂2009年第3题 (cell.pas/c/cpp) 【问题描述】 Hanks博士是BT(Bio-Tech,生物技术)领域的知名专家。 现在,他正在为一个细胞实验做准备工作: 培养细胞样本。 Hanks博士手里现在有N种细胞,编号从1~N,一个第i种细胞经过1秒钟可以分裂为Si个同种细胞(Si为正整数)。 现在他需要选取某种细胞的一个放进培养皿,让其自由分裂,进行培养。 一段时间以后,再把培养皿中的所有细胞平均分入M个试管,形成M份样本,用于实验。 Hanks博士的试管数M很大,普通的计算机的基本数据类型无法存储这样大的M值,但万幸的是,M总可以表示为m1的m2次方,即21 M=mm,其中m1,m2均为基本数据类型可以存储的正整数。 注意,整个实验过程中不允许分割单个细胞,比如某个时刻若培养皿中有4个细胞, Hanks博士可以把它们分入2个试管,每试管内2个,然后开始实验。 但如果培养皿中有5个细胞,博士就无法将它们均分入2个试管。 此时,博士就只能等待一段时间,让细胞们继续分裂,使得其个数可以均分,或是干脆改换另一种细胞培养。 为了能让实验尽早开始,Hanks博士在选定一种细胞开始培养后,总是在得到的细胞“刚好可以平均分入M个试管”时停止细胞培养并开始实验。 现在博士希望知道,选择哪种细胞培养,可以使得实验的开始时间最早。 【输入】 输入文件名为cell.in,共有三行。 第一行有一个正整数N,代表细胞种数。 第二行有两个正整数m1,m2,以一个空格隔开,21 mm即表示试管的总数M。 第三行有N个正整数,第i个数Si表示第i种细胞经过1秒钟可以分裂成同种细胞的个 数。 【输出】 输出文件cell.out共一行,为一个整数,表示从开始培养细胞到实验能够开始所经过的 最少时间(单位为秒)。 如果无论Hanks博士选择哪种细胞都不能满足要求,则输出整数-1。 【输入输出样例1】 cell.incell.out 1 21 3 -1 【输入输出样例1说明】 经过1秒钟,细胞分裂成3个,经过2秒钟,细胞分裂成9个,……,可以看出无论怎么分裂,细胞的个数都是奇数,因此永远不能分入2个试管。 【输入输出样例2】 cell.incell.out 2 241 3012 2 【输入输出样例2说明】 第1种细胞最早在3秒后才能均分入24个试管,而第2种最早在2秒后就可以均分(每试管144/(241)=6个)。 故实验最早可以在2秒后开始。 【数据范围】 对于50%的数据,有21 mm≤30000。 对于所有的数据,有1≤N≤10000,1≤m1≤30000,1≤m2≤10000,1≤Si≤2,000,000,000。 第12题道路游戏2009年第4题 (game.pas/c/cpp) 【问题描述】 小新正在玩一个简单的电脑游戏。 游戏中有一条环形马路,马
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- pascalnoip 历届 精选 试题