高级本光盘模拟试题集.docx
- 文档编号:5426399
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:47
- 大小:55KB
高级本光盘模拟试题集.docx
《高级本光盘模拟试题集.docx》由会员分享,可在线阅读,更多相关《高级本光盘模拟试题集.docx(47页珍藏版)》请在冰豆网上搜索。
高级本光盘模拟试题集
全国青少年信息学奥林匹克联赛培训习题与解答
(中学高级本)
光盘模拟试题集
目录
普及组2
第一套2
打保龄球2
安全逃离2
表达式的转换3
到天宫做客4
第二套5
奶牛卧室5
进制转换5
硬币翻转5
拱猪计分6
第三套7
车厢重组7
阶乘问题8
子数整数8
垃圾陷阱9
提高组10
第一套10
低价购买10
棋盘游戏10
求正整数11
奇怪的电梯11
第二套12
轰炸12
连续自然数和12
约瑟夫13
点和线13
第三套14
杂务14
排行榜14
银行贷款15
机器人搬重物16
第四套17
数字组合17
相似基因17
波浪数18
文件压缩19
省队训练20
第一套20
海战20
POLYGON20
POWER21
婚礼21
第二套22
多边形的面积22
玛丽卡23
PASTE24
SEARCH24
第三套25
文件排版25
纵横填字游戏26
普通递归关系27
完美的对称28
普及组
第一套
打保龄球
源程序名 bowling.?
?
?
(pas,c,cpp)
可执行文件名bowling.exe
输入文件名 bowling.in
输出文件名bowling.out
打保龄球是用一个滚球去打击十个站立的柱,将柱击倒。
一局分十轮,每轮可滚球一次或多次,以击倒的柱数为依据计分。
一局得分为十轮得分之和,而每轮的得分不仅与本轮滚球情况有关,还可能与后续一两轮的滚球情况有关。
即某轮某次滚球击倒的柱数不仅要计入本轮得分,还可能会计入前一两轮得分。
具体的滚球击柱规则和计分方法如下:
(1)若某一轮的第一次滚球就击倒全部十个柱,则本轮不再滚球(若是第十轮则还需另加两次滚球,不妨称其为第十一轮和第十二轮,并不是所有的情况都需要滚第十一轮和第十二轮球)。
该轮得分为本次击倒柱数10与以后两次滚球所击倒柱数之和。
(2)若某一轮的第一次滚球未击倒十个柱,则可对剩下未倒的柱再滚球一次。
如果这两次滚球击倒全部十个柱,则本轮不再滚球(若是第十轮则还需另加一次滚球),该轮得分为这两次共击倒柱数10与以后一次滚球所击倒柱数之和。
(3)若某一轮两次滚球未击倒全部十个柱,则本轮不再继续滚球,该轮得分为这两次滚球击倒的柱数之和。
总之,若—轮中一次滚球或两次滚球击倒十个柱,则本轮得分是本轮首次滚球开始的连续三次滚球击倒柱数之和(其中有一次或两次不是本轮滚球)。
若一轮内二次滚球击倒柱数不足十个,则本轮得分即为这两次击倒柱数之和。
下面以实例说明如下(字符“/”表示击倒当前球道上的全部的柱):
轮123456789101112
击球情况///729/818//9//8/
各轮得分302719918920202020
累计总分30577685103112132152172192
现在请你编写一个保龄球实时计分程序,用来计算和显示某轮结束后的得分情况。
若某轮的得分暂时无法算出,则该轮得分不显示。
输入:
输入数据用文件bowling.in,文件内容仅有一行,为前若干轮滚球的情况,每轮滚球用一到两个字符表示,每一个字符表示一次击球,字符“/”表示击倒当前球道上的全部的柱,否则用一个数字字符表示本次滚球击倒的当前球道上的柱的数目,两轮滚球之间用一个空格字符隔开。
如上例对应的输入文件内容为:
///729/818//9//8/
输出:
输出到文件bowling.out,共两行,第一行为每轮得分,第二行为到当前轮为止的总得分。
每个得分之间用一个空格隔开。
样例输入:
///729/818//9//8/
样例输出:
302719918920202020
30577685103112132152172192
安全逃离
源程序名EVAC.?
?
?
(PAS,C,CPP)
可执行文件名EVAC.EXE
输入文件名EVAC.IN
输出文件名EVAC.OUT
农夫john最近在研究如果发生重大事故,如何让农场里的奶牛逃离问题。
他想要确信在紧急情况下,所有的奶牛都有一个安全逃离方案。
因为在紧急情况下,奶牛们都会失去观察和判断能力,所以最近john一直在教奶牛们逃离的方法,他的方法很简单,就是任何时候都只向北方或东方逃离,北方是行坐标减1的方向,东方是列坐标加1的方向。
奶牛们虽笨,不过这一点事关自己的生命,所以他们牢记在心,而且也一定会这么做。
当然也会出问题,奶牛们在逃离的方向上会横冲直撞,为了阻止奶牛之间互相冲撞造成伤害,john要求任何一个奶牛的逃离路线不能经过其它奶牛的初始位置。
一个逃离方案是安全的如果它能够满足上面的要求,反之它就是不安全的。
奶牛们所在的土地(农场)被划分成了r行和c列的一个矩形地图。
奶牛们都待在这个矩形中的某一个位置。
请帮助john确定给定的一个地图上是否存在一个安全的逃离方案。
比如,下面的两个图:
左边的例子表示了一个能够安全逃离的地图,因为没有任何一个奶牛的逃离路线上包括其他奶牛。
右边的例子表示了一个不安全的地图,因为位于(4,1)的奶牛不论是向东逃离还是向北逃离,它的路线上都会有别的奶牛,从这个图中拿掉任意一头奶牛,这个地图都会变成安全的。
安全不安全
||||C--C.....
||||C--^.....
|C||C--|.....
CC-+-+----C------>C.
..CCC--......
C表示奶牛,直线表示逃离路线
输入
第1行:
两个整数r,c,用1个空格隔开,表示矩形的行数和列数(均不超过50)。
第2行:
一个整数n,表示奶牛的个数(不超过100)。
第3到n+2行:
共n行,每行有两个整数,之间用1个空格隔开,分别表示这头奶牛所在的行和列。
输出
如果这块土地是安全的,输出0。
如果移走任意一头奶牛这块土地还是不安全,输出-1。
否则输出1,并且在下一行输出移走的那头奶牛的编号,如果有多个奶牛满足要求,输出输入序列中编号最小一个。
样例
EVAC.IN
55
5
11
24
31
22
21
EVAC.OUT
1
5
表达式的转换(难度系数★★★)
源程序名 express.?
?
?
(PAS,C,CPP)
可执行文件名express.exe
输入文件名 express.in
输出文件名express.out
[问题描述]:
平常我们书写的表达式称为中缀表达式,因为它将运算符放在两个操作数中间,许多情况下为了确定运算顺序,括号是不可少的,而中缀表达式就不必用括号了。
后缀标记法:
书写表达式时采用运算紧跟在两个操作数之后,从而实现了无括号处理和优先级处理,使计算机的处理规则简化为:
从左到右顺序完成计算,并用结果取而代之。
例如:
8–(3+2*6)/5+4可以写为:
8326*+5/–4+
其计算步骤为:
8326*+5/–4+
8312+5/–4+
8155/–4+
83–4+
54+
9
编写一个程序,完成这个转换,要求输出的每一个数据间都留一个空格。
[输入]:
就一行,是一个后缀表达式。
输入的符号中只有这些基本符号“0123456789+-*/^()”,并且不会出现形如2*-3的格式。
表达式中的基本数字也都是一位的,不会出现形如12形式的数字。
所输入的字符串不要判错。
[输出]:
若干个中缀表达式,第I+1行比第I行少一个运算符和一个操作数,最后一行只有一个数字,表示运算结果。
运算的结果可能为负数,“/”以整除运算。
并且中间每一步都不会超过2^31。
[样例]:
express.in
8–(3+2*6)/5+4
express.out
8326*+5/–4+
8312+5/–4+
8155/–4+
83–4+
54+
9
到天宫做客
源程序名 HEAVEN.?
?
?
(pas,c,cpp)
可执行文件名HEAVEN.exe
输入文件名 HEAVEN.in
输出文件名HEAVEN.out
有一天,我做了个梦,梦见我很荣幸的接到了猪八戒的邀请,到天宫陪他吃酒。
我犹豫了。
天上一日,人间一年啊!
当然,我是个闲人,一年之中也没有多少时日是必须在人间的,因此,我希望选一个最长的空闲时间段,使我在天上待的时间尽量长。
记住,今年是4000年。
天上一天也是24小时,每小时60分,每分60秒。
输入
输入文件的第一行是一个非负整数N,表示4000年中必须呆在人间的天数,以下共N行,每行两个用空格隔开的正整数,即日期(月,日),输入文件保证无错误,日期无重复。
输出
输出文件仅有一行包含一个非负整数,即在天上的时间(四舍五入精确到秒)。
样例
heaven.in
2
38
122
heaven.out
63266
第二套
奶牛卧室
源程序名BED.?
?
?
(PAS,C,CPP)
可执行文件名BED.EXE
输入文件名BED.IN
输出文件名BED.OUT
奶牛们有一个习惯,那就是根据自己的编号选择床号。
如果一头奶牛编号是a,并且有0..k-1一共k张床,那么她就会选择amodk号床作为她睡觉的地点。
显然,2头牛不能睡在一张床上。
那么给出一些奶牛的编号,请你为她们准备一间卧室,使得里面的床的个数最少。
输入
第一行是奶牛的个数n(1<=n<=5000);第2到第n+1行是每头奶牛的编号Si(1<=Si<=1000000)。
输出
仅一行,是最少的床的数目。
样例
BED.IN
5
4
6
9
10
13
BED.OUT
8
进制转换
源程序名 change.?
?
?
(pas,c,cpp)
可执行文件名change.exe
输入文件名 change.in
输出文件名change.out
请你编一程序实现两种不同进制之间的数据转换。
输入:
输入数据共有三行,第一行是一个正整数,表示需要转换的数的进制n(2≤n≤16),第二行是一个n进制数,若n>10则用大写字母A~F表示数码10~15,并且该n进制数对应的十进制的值不超过1000000000,第三行也是一个正整数,表示转换之后的数的进制m(2≤m≤16)。
输出:
输出仅一行,包含一个正整数,表示转换之后的m进制数。
样例:
change.in
16
FF
2
change.out
11111111
硬币翻转
源程序名 coin.?
?
?
(pas,c,cpp)
可执行文件名coin.exe
输入文件名 coin.in
输出文件名coin.out
在桌面上有一排硬币,共N枚,每一枚硬币均为正面朝上。
现在要把所有的硬币翻转成反面朝上,规则是每次可翻转任意N-1枚硬币(正面向上的被翻转为反面向上,反之亦然)。
求一个最短的操作序列(将每次翻转N-1枚硬币成为一次操作)。
输入:
输入只有一行,包含一个自然数N(N为不大于100的偶数)。
输出:
输出文件的第一行包含一个整数S,表示最少需要的操作次数。
接下来的S行每行分别表示每次操作后桌上硬币的状态(一行包含N个整数(0或1),表示每个硬币的状态:
0——正面向上,和1——反面向上,不允许出现多余空格)。
对于有多种操作方案的情况,则只需输出一种。
样例:
coin.in
4
coin.out
4
0111
1100
0001
1111
拱猪计分
源程序名 HEART.?
?
?
(pas,c,cpp)
可执行文件名HEART.exe
输入文件名 HEART.in
输出文件名HEART.out
拱猪是一种很有趣的扑克牌游戏。
即使你不知道它的玩法,你也可以由它的计分方式来了解它的趣味性。
假设在此我们仅考虑四个人的拱猪牌局,本题要求你根据下面的计分规则,在牌局结束时计算四位玩家所得分数。
1.我们分别以S、H、D及C来代表黑桃,红心,方块及梅花,并以数字1至13来代表A、2、…、Q、K等牌点,例如︰H1为红心A,S13为黑桃K。
2.牌局结束时,由各玩家持有的有关计分的牌(计分牌)仅有S12(猪),所有红心牌,D11(羊)及C10(加倍)等16张牌。
其它牌均弃置不计。
若未持有这16张牌之任一张则以得零分计算。
3.若持有C10的玩家只有该张牌而没有任何其它牌则得+50分,若除了C10还有其它计分牌,则将其它计分牌所得分数加倍计算。
4.若红心牌不在同一家,则H1至H13等13张牌均以负分计,其数值为-50,-2,-3,-4,-5,-6,-7,-8,-9,-10,-20,-30,-40。
而且S12与D11分别以-100及+100分计算。
5.若红心牌H1至H13均在同一家,有下列情形︰
o所有红心牌以+200分计算。
o若S12、D11皆在吃下所有红心牌之一家,则此玩家得+500分。
o而C10还是以前面所述原则计算之。
例一:
若各玩家持有计分牌如下:
(每列代表一玩家所持有之牌)
S12H3H5H13
D11H8H9
C10H1H2H4H6H7
H10H11H12
则各家之得分依序为:
-148、+83、-138及-60。
例二:
若各玩家持有计分牌如下:
(第四家未持有任何计分牌)
H1H2H3H4H5H6H7H8H9H10H11H12H13
S12C10
D11
则各家之得分依序为:
+200、-200、+100及0。
例三:
若有一玩家持有所有16张计分牌,则得+1000分。
其余三家均得零分。
输入:
每个输入文件由多组测试数据构成,每组测试数据有四行,每一行第一个数为该玩家所持有计分牌总数,而后列出其所持有之所有计分牌,牌数与各计分牌均以一个以上的空格分开。
相邻两组测试数据之间不会有空白行,读到四家持牌数都为0表示文件结束。
输出:
每一行输出一组测试数据对应的结果,依次输出各家所得分数,共四个整数(含正负号,0除外),相邻两个整数之间以一个空格分开,符号和数字间不可以有空格。
每组输出间不需要有空白行。
样例
HEART.IN
4S12H3H5H13
3D11H8H9
6C10H1H2H4H6H7
3H10H11H12
13H1H2H3H4H5H6H7H8H9H10H11H12H13
2S12C10
1D11
0
0
0
0
0
HEART.OUT
-148+83-138-60
+200-200+1000
第三套
车厢重组(难度系数☆)
源程序名 carry.?
?
?
(PAS,C,CPP)
可执行文件名carry.exe
输入文件名 carry.in
输出文件名carry.out
[问题描述]:
在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥墩水平旋转。
一个车站的职工发现桥的长度最多能容纳两节车厢,如果将桥旋转180度,则可以把相邻两节车厢的位置交换,用这种方法可以重新排列车厢的顺序。
于是他就负责用这座桥将进站的车厢按车厢号从小到大排列。
他退休后,火车站决定将这一工作自动化,其中一项重要的工作是编一个程序,输入初始的车厢顺序,计算最少用多少步就能将车厢排序。
[输入]:
输入文件有两行数据,第一行是车厢总数N(不大于10000),第二行是N个不同的数表示初始的车厢顺序。
[输出]:
一个数据,是最少的旋转次数。
[样例]:
carry.in
4
4321
carry.out
6
阶乘问题
源程序名 fact.?
?
?
(pas,c,cpp)
可执行文件名fact.exe
输入文件名 fact.in
输出文件名fact.out
也许你早就知道阶乘的含义,N阶乘是由1到N相乘而产生,如:
12!
=1x2x3x4x5x6x7x8x9x10x11x12=479,001,600
12的阶乘最右边的非零位为6。
写一个程序,计算N(1<=N<=50,000,000)阶乘的最右边的非零位的值。
注意:
10,000,000!
有2499999个零。
输入
仅一行包含一个正整数N。
输出
单独一行包含一个整数表示最右边的非零位的值。
样例
fact.in
12
fact.out
6
子数整数
源程序名 num.?
?
?
(pas,c,cpp)
可执行文件名num.exe
输入文件名 num.in
输出文件名num.out
对于一个五位数a1a2a3a4a5,可将其拆分为三个子数:
sub1=a1a2a3
sub2=a2a3a4
sub3=a3a4a5
例如,五位数20207可以拆分成
sub1=202
sub2=020(=20)
sub3=207
现在给定一个正整数K,要求你编程求出10000到30000之间所有满足下述条件的五位数,条件是这些五位数的三个子数sub1,sub2,sub3都可被K整除。
输入
输入由键盘输入,输入仅一行,为正整数K(0 输出 输出到文件,输出文件的每一行为一个满足条件的五位数,要求从小到大输出。 不得重复输出或遗漏。 如果无解,则输出“No”。 样例 num.in 15 num.out 22555 25555 28555 30000 垃圾陷阱 源程序名WELL.? ? ? (PAS,C,CPP) 可执行文件名WELL.EXE 输入文件名WELL.IN 输出文件名WELL.OUT 卡门——农夫约翰极其珍视的一条Holsteins奶牛——已经落了到“垃圾井”中。 “垃圾井”是农夫们扔垃圾的地方,它的深度为D(2<=D<=100)英尺。 卡门想把垃圾堆起来,等到堆得与井同样高时,她就能逃出井外了。 另外,卡门可以通过吃一些垃圾来维持自己的生命。 每个垃圾都可以用来吃或堆放,并且堆放垃圾不用花费卡门的时间。 假设卡门预先知道了每个垃圾扔下的时间t(0 输入 第一行为2个整数,D和G(1<=G<=100),G为被投入井的垃圾的数量。 第二到第G+1行每行包括3个整数: T(0 输出 如果卡门可以爬出陷阱,输出一个整表示最早什么时候可以爬出;否则输出卡门最长可以存活多长时间。 样例 WELL.IN 204 549 932 12610 1311 WELL.OUT 13 [样例说明] 卡门堆放她收到的第一个垃圾: height=9; 卡门吃掉她收到的第二个垃圾,使她的生命从10小时延伸到13小时; 卡门堆放第3个垃圾,height=19; 卡门堆放第4个垃圾,height=20。 提高组 第一套 低价购买 源程序名 BUYLOW.? ? ? (PAS,C,CPP) 可执行文件名BUYLOW.EXE 输入文件名 BUYLOW.IN 输出文件名BUYLOW.OUT “低价购买”这条建议是在奶牛股票市场取得成功的一半规则。 要想被认为是伟大的投资者,你必须遵循以下的问题建议: “低价购买;再低价购买”。 每次你购买一支股票,你必须用低于你上次购买它的价格购买它。 买的次数越多越好! 你的目标是在遵循以上建议的前提下,求你最多能购买股票的次数。 你将被给出一段时间内一支股票每天的出售价(216范围内的正整数),你可以选择在哪些天购买这支股票。 每次购买都必须遵循“低价购买;再低价购买”的原则。 写一个程序计算最大购买次数。 这里是某支股票的价格清单: 日期123456789101112 价格686954646864706778629887 最优秀的投资者可以购买最多4次股票,可行方案中的一种是: 日期25610 价格69686462 输入 第1行: N(1<=N<=5000),股票发行天数 第2行: N个数,是每天的股票价格。 输出 输出文件仅一行包含两个数: 最大购买次数和拥有最大购买次数的方案数(<=231)当二种方案“看起来一样”时(就是说它们构成的价格队列一样的时候),这2种方案被认为是相同的。 样例 BUYLOW.IN 12 686954646864706778629887 BUYLOW.OUT 42 棋盘游戏(game) 源程序名game.? ? ? (pas,c,cpp) 可执行文件名game.exe 输入文件名game.in 输出文件名game.out 时限2s 在一个4*4的棋盘上有8个黑棋和8个白棋,当且仅当两个格子有公共边,这两个格子上的棋是相邻的。 移动棋子的规则是交换相邻两个棋子。 现在给出一个初始棋盘和一个最终棋盘,要求你找出一个最短的移动序列使初始棋盘变为最终棋盘。 Klux说: “这么简单的题目,我都会做! ” 输入: 第1到4行每行四个数字(1或者0),描述了初始棋盘 接着是一个空行 第6到9行每行四个数字,描述了最终棋盘 输出: 输出文件的第一行是一个整数n,表示最少的移动步数。 接下来n行每行4个数,r1,c1,r2,c2,表示移动的两个棋子的坐标(r1,c1),(r2,c2)(棋盘左上角的坐标为(1,1),并且他右边的格子为(1,2)) 如果有许多组解,你可以输出任意一组。 样例: game.in: 1111 0000 1110 0010 1010 0101 1010 0101 game.out 4 1222 1424 3242 4344 说明: 翻译自ceoi99-game,数据及解答由ceoi提供。 求正整数 源程序名 INT.? ? ? (PAS,C,CPP) 可执行文件名INT.EXE 输入文件名 INT.IN 输出文件名INT.OUT 对于任意输入的正整数n,请编程求出具有n个不同因子的最小正整数m。 例如: n=4,则m=6,因为6有4个不同整数因子1,2,3,6;而且是最小的有4个因子的整数。 输入 n(1≤n≤50000) 输出 m 样例 INT.IN
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 高级 光盘 模拟 试题