全国信息学奥林匹克竞赛NOIP试题汇总.docx
《全国信息学奥林匹克竞赛NOIP试题汇总.docx》由会员分享,可在线阅读,更多相关《全国信息学奥林匹克竞赛NOIP试题汇总.docx(12页珍藏版)》请在冰豆网上搜索。
![全国信息学奥林匹克竞赛NOIP试题汇总.docx](https://file1.bdocx.com/fileroot1/2022-12/12/e55e90b8-fda8-4875-88e5-74d4921b25a0/e55e90b8-fda8-4875-88e5-74d4921b25a01.gif)
全国信息学奥林匹克竞赛NOIP试题汇总
2002年全国青少年信息学(计算机)奥林匹克分区联赛复赛试题
题一级数求和(存盘名:
NOIPC1)
[问题描述]:
已知:
Sn=1+1/2+1/3+„+1/n。
显然对于任意一个整数K,当n足够大的时候,Sn大于K。
现给出一个整数K(1<=k<=15),要求计算出一个最小的n;使得Sn>K。
[输入]
键盘输入k
[输出]
屏幕输出n
[输入输出样例]
输人:
1
输出:
2
题二选数(存盘名:
NOIPC2)
[问题描述]:
已知n个整数x1,x2,„,xn,以及一个整数k(k<n)。
从n个整数中任选k个整数相加,可分别得到一系列的和。
例如当n=4,k=3,4个整数分别为3,7,12,19时,可得全部的组合与它们的和为:
3+7+12=223+7+19=297+12+19=383+12+19=34。
现在,要求你计算出和为素数共有多少种。
例如上例,只有一种的和为素数:
3+7+19=29)。
[输入]:
键盘输入,格式为:
n,k(1<=n<=20,k<n)
x1,x2,„,xn(1<=xi<=5000000)
[输出]:
屏幕输出,格式为:
一个整数(满足条件的种数)。
[输入输出样例]:
输入:
43
371219
输出:
1
题三产生数(存盘名:
NOIPC3)
[问题描述]:
给出一个整数n(n<10^30)和k个变换规则(k<=15)。
规则:
一位数可变换成另一个一位数:
规则的右部不能为零。
例如:
n=234。
有规则(k=2):
2->5
3->6
上面的整数234经过变换后可能产生出的整数为(包括原数):
234
534
264
564
共4种不同的产生数
问题:
给出一个整数n和k个规则。
求出:
经过任意次的变换(0次或多次),能产生出多少个不同整数。
仅要求输出个数。
[输入]:
键盘输人,格式为:
nk
x1y1
x2y2
......
xnyn
[输出]:
屏幕输出,格式为:
一个整数(满足条件的个数):
[输入输出样例]:
输入:
2342
25
36
输出:
4
题四过河卒(存盘名:
NOIPC4)
[问题描述]:
如图,A点有一个过河卒,需要走到目标B点。
卒行走规则:
可以向下、或者向右。
同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点。
例如上图C点上的马可以控制9个点(图中的P1,P2„P8和C)。
卒不能通过对方马的控制点。
棋盘用坐标表示,A点(0,0)、B点(n,m)(n,m为不超过20的整数,并由键盘输入),同样马的位置坐标是需要给出的(约定:
C<>A,同时C<>B)。
现在要求你计算出卒从A点能够到达B点的路径的条数。
[输入]:
键盘输入
B点的坐标(n,m)以及对方马的坐标(X,Y){不用盘错}
[输出]:
屏幕输出
一个整数(路径的条数)。
[输入输出样例]:
输入:
6632
输出:
17
2005年第十一届NOIP复赛试题(提高组)
发布日期:
2006-01-22访问总次数:
11
谁拿了最多奖学金
(scholar.pas/c/cpp)
【问题描述】
某校的惯例是在每学期的期末考试之后发放奖学金。
发放的奖学金共有五种,获取的条件各自不同:
1)院士奖学金,每人8000元,期末平均成绩高于80分(>80),并且在
本学期内发表1篇或1篇以上论文的学生均可获得;
2)五四奖学金,每人4000元,期末平均成绩高于85分(>85),并且班
级评议成绩高于80分(>80)的学生均可获得;
3)成绩优秀奖,每人2000元,期末平均成绩高于90分(>90)的学生均
可获得;
4)西部奖学金,每人1000元,期末平均成绩高于85分(>85)的西部省
份学生均可获得;
5)班级贡献奖,每人850元,班级评议成绩高于80分(>80)的学生干
部均可获得;
只要符合条件就可以得奖,每项奖学金的获奖人数没有限制,每名学生也可以同时获得多项奖学金。
例如姚林的期末平均成绩是87分,班级评议成绩82分,同时他还是一位学生干部,那么他可以同时获得五四奖学金和班级贡献奖,奖金总数是4850元。
现在给出若干学生的相关数据,请计算哪些同学获得的奖金总数最高(假设总有同学能满足获得奖学金的条件)。
【输入文件】
输入文件scholar.in的第一行是一个整数N(1<=N<=100),表示学生的总数。
接下来的N行每行是一位学生的数据,从左向右依次是姓名,期末平均成绩,班级评议成绩,是否是学生干部,是否是西部省份学生,以及发表的论文数。
姓名是由大小写英文字母组成的长度不超过20的字符串(不含空格);期末平均成绩和班级评议成绩都是0到100之间的整数(包括0和100);是否是
学生干部和是否是西部省份学生分别用一个字符表示,Y表示是,N表示不是;发表的论文数是0到10的整数(包括0和10)。
每两个相邻数据项之间用一个空格分隔。
【输出文件】
输出文件scholar.out包括三行,第一行是获得最多奖金的学生的姓名,第二行是这名学生获得的奖金总数。
如果有两位或两位以上的学生获得的奖金最多,输出他们之中在输入文件中出现最早的学生的姓名。
第三行是这N个学生获得的奖学金的总数。
【样例输入】
4
YaoLin8782YN0
ChenRuiyi8878NY1
LiXin9288NN0
ZhangQin8387YN1
【样例输出】
ChenRuiyi
9000
28700
过河
(river.pas/c/cpp)
【问题描述】
在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧。
在桥上有一些石子,青蛙很讨厌踩在这些石子上。
由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上的一串整点:
0,1,„„,L(其中L是桥的长度)。
坐标为0的点表示桥的起点,坐标为L的点表示桥的终点。
青蛙从桥的起点开始,不停的向终点方向跳跃。
一次跳跃的距离是S到T之间的任意正整数(包括S,T)。
当青蛙跳到或跳过坐标为L的点时,就算青蛙已经跳出了独木桥。
题目给出独木桥的长度L,青蛙跳跃的距离范围S,T,桥上石子的位置。
你的任务是确定青蛙要想过河,最少需要踩到的石子数。
【输入文件】
输入文件river.in的第一行有一个正整数L(1<=L<=109),表示独木桥的长度。
第二行有三个正整数S,T,M,分别表示青蛙一次跳跃的最小距离,最大距离,及桥上石子的个数,其中1<=S<=T<=10,1<=M<=100。
第三行有M个不同的正整数分别表示这M个石子在数轴上的位置(数据保证桥的起点和终点处没有石子)。
所有相邻的整数之间用一个空格隔开。
【输出文件】
输出文件river.out只包括一个整数,表示青蛙过河最少需要踩到的石子数。
【样例输入】
10
235
23567
【样例输出】
2
【数据规模】
对于30%的数据,L<=10000;
对于全部的数据,L<=109。
篝火晚会
(fire.pas/c/cpp)
【问题描述】
佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”。
在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会。
一共有n个同学,编号从1到n。
一开始,同学们按照1,2,„„,n的顺序坐成一圈,而实际上每个人都有两个最希望相邻的同学。
如何下命令调整同学的次序,形成新的一个圈,使之符合同学们的意愿,成为摆在佳佳面前的一大难题。
佳佳可向同学们下达命令,每一个命令的形式如下:
(b1,b2,...bm-1,bm)
这里m的值是由佳佳决定的,每次命令m的值都可以不同。
这个命令的作用是移动编号是b1,b2,„„bm–1,bm的这m个同学的位置。
要求b1换到b2的位
置上,b2换到b3的位置上,„„,要求bm换到b1的位置上。
执行每个命令都需要一些代价。
我们假定如果一个命令要移动m个人的位置,那么这个命令的代价就是m。
我们需要佳佳用最少的总代价实现同学们的意愿,你能帮助佳佳吗?
【输入文件】
输入文件fire.in的第一行是一个整数n(3<=n<=50000),表示一共有n个同学。
其后n行每行包括两个不同的正整数,以一个空格隔开,分别表示编号是1的同学最希望相邻的两个同学的编号,编号是2的同学最希望相邻的两个同学的编号,„„,编号是n的同学最希望相邻的两个同学的编号。
【输出文件】
输出文件fire.out包括一行,这一行只包含一个整数,为最小的总代价。
如果无论怎么调整都不能符合每个同学的愿望,则输出-1。
【样例输入】
4
34
43
12
12
【样例输出】
2
【数据规模】
对于30%的数据,n<=1000;
对于全部的数据,n<=50000。
等价表达式
(equal.pas/c/cpp)
【问题描述】
明明进了中学之后,学到了代数表达式。
有一天,他碰到一个很麻烦的选择题。
这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个
选项也是一个代数表达式,题目的要求是判断选项中哪些代数表达式是和题干中的表达式等价的。
这个题目手算很麻烦,因为明明对计算机编程很感兴趣,所以他想是不是可以用计算机来解决这个问题。
假设你是明明,能完成这个任务吗?
这个选择题中的每个表达式都满足下面的性质:
1.表达式只可能包含一个变量‘a’。
2.表达式中出现的数都是正整数,而且都小于10000。
3.表达式中可以包括四种运算‘+’(加),‘-’(减),‘*’(乘),‘^’(乘幂),以及小括号‘(’,‘)’。
小括号的优先级最高,其次是‘^’,然后是‘*’,最后是‘+’和‘-’。
‘+’和‘-’的优先级是相同的。
相同优先级的运算从左到右进行。
(注意:
运算符‘+’,‘-’,‘*’,‘^’以及小括号‘(’,‘)’都是英文字符)
4.幂指数只可能是1到10之间的正整数(包括1和10)。
5.表达式内部,头部或者尾部都可能有一些多余的空格。
下面是一些合理的表达式的例子:
((a^1)^2)^3,a*a+a-a,((a+a)),9999+(a-a)*a,1+(a-1)^3,1^10^9„„
【输入文件】
输入文件equal.in的第一行给出的是题干中的表达式。
第二行是一个整数n(2<=n<=26),表示选项的个数。
后面n行,每行包括一个选项中的表达式。
这n个选项的标号分别是A,B,C,D„„
输入中的表达式的长度都不超过50个字符,而且保证选项中总有表达式和题干中的表达式是等价的。
【输出文件】
输出文件equal.out包括一行,这一行包括一系列选项的标号,表示哪些选项是和题干中的表达式等价的。
选项的标号按照字母顺序排列,而且之间没有空格。
【样例输入】
(a+1)^2
3
(a-1)^2+4*a
a+1+a
a^2+2*a*1+1^2+10-10+a-a
【样例输出】
AC
【数据规模】
对于30%的数据,表达式中只可能出现两种运算符‘+’和‘-’;
对于其它的数据,四种运算符‘+’,‘-’,‘*’,‘^’在表达式中都可能出现。
对于全部的数据,表达式中都可能出现小括号‘(’和‘)’。
【推荐给朋友】
关闭窗口】【
2005年第十一届NOIP复赛试题(普及组)
发布日期:
2006-01-22访问总次数:
12
一、陶陶摘苹果
(apple.pas/c/cpp)
【问题描述】
陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果。
苹果成熟的时候,陶陶就会跑去摘苹果。
陶陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。
现在已知10个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目。
假设她碰到苹果,苹果就会掉下来。
【输入文件】
输入文件apple.in包括两行数据。
第一行包含10个100到200之间(包括100和200)的整数(以厘米为单位)分别表示10个苹果到地面的高度,两个相邻的整数之间用一个空格隔开。
第二行只包括一个100到120之间(包含100和120)的整数(以厘米为单位),表示陶陶把手伸直的时候能够达到的最大高度。
【输出文件】
输出文件apple.out包括一行,这一行只包含一个整数,表示陶陶能够摘到的苹果的数目。
【样例输入】
100200150140129134167198200111
110
【样例输出】
5
二、校门外的树
(tree.pas/c/cpp)
【问题描述】
某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。
我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,„„,L,都种有一棵树。
由于马路上有一些区域要用来建地铁。
这些区域用它们在数轴上的起始点和终止点表示。
已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。
现在要把这些区域中的树(包括区域端点处的两棵树)移走。
你的任务是计算将这些树都移走后,马路上还有多少棵树。
【输入文件】
输入文件tree.in的第一行有两个整数L(1<=L<=10000)和M(1<=M<=100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。
接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。
【输出文件】
输出文件tree.out包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。
【样例输入】
5003
150300
100200
470471
【样例输出】
298
【数据规模】
对于20%的数据,区域之间没有重合的部分;
对于其它的数据,区域之间有重合的情况。
三、采药
(medic.pas/c/cpp)
【问题描述】
辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。
为此,他想拜附近最有威望的医师为师。
医师为了判断他的资质,给他出了一个难题。
医师把他带到一个到处都是草药的山洞里对他说:
“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。
我会给你一段时间,在这段时间里,你可以采到一些草药。
如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。
”
如果你是辰辰,你能完成这个任务吗?
【输入文件】
输入文件medic.in的第一行有两个整数T(1<=T<=1000)和M(1<=M<=100),用一个空格隔开,T代表总共能够用来采药的时间,M代表山洞里的草药的数目。
接下来的M行每行包括两个在1到100之间(包括1和100)的整数,分别表示采摘某株草药的时间和这株草药的价值。
【输出文件】
输出文件medic.out包括一行,这一行只包含一个整数,表示在规定的时间内,可以采到的草药的最大总价值。
【样例输入】
703
71100
691
12
【样例输出】
3
【数据规模】
对于30%的数据,M<=10;
对于全部的数据,M<=100。
四、循环
(circle.pas/c/cpp)
【问题描述】
乐乐是一个聪明而又勤奋好学的孩子。
他总喜欢探求事物的规律。
一天,他突然对数的正整数次幂产生了兴趣。
众所周知,2的正整数次幂最后一位数总是不断的在重复2,4,8,6,2,4,8,6„„我们说2的正整数次幂最后一位的循环长度是4(实际上4的倍数都可以说是循环长度,但我们只考虑最小的循环长度)。
类似的,其余的数字的正整
个整数n的正整数次幂来说,它的后k位是否会发生循环?
如果循环的话,循环长度是多少呢?
注意:
1.如果n的某个正整数次幂的位数不足k,那么不足的高位看做是0。
2.如果循环长度是L,那么说明对于任意的正整数a,n的a次幂和a+L次幂的最后k位都相同。
【输入文件】
输入文件circle.in只有一行,包含两个整数n(1<=n<10100)和k(1<=k<=100),n和k之间用一个空格隔开,表示要求n的正整数次幂的最后k位的循环长度。
【输出文件】
输出文件circle.out包括一行,这一行只包含一个整数,表示循环长度。
如果循环不存在,输出-1。
【样例输入】
322
【样例输出】
4
【数据规模】
对于30%的数据,k<=4;
对于全部的数据,k<=100。