NOIP历年复赛提高组试题Word下载.docx
《NOIP历年复赛提高组试题Word下载.docx》由会员分享,可在线阅读,更多相关《NOIP历年复赛提高组试题Word下载.docx(76页珍藏版)》请在冰豆网上搜索。
2、合并果子(fruit.pas/dpr/c/cpp)
在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。
多多决定把所有的果子合成一堆。
每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。
可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。
多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。
因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。
假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值。
例如有3种果子,数目依次为1,2,9。
可以先将1、2堆合并,新堆数目为3,耗费体力为3。
接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为12。
所以多多总共耗费体力=3+12=15。
可以证明15为最小的体力耗费值。
输入文件fruit.in包括两行,第一行是一个整数n(1<
=n<
=10000),表示果子的种类数。
第二行包含n个整数,用空格分隔,第i个整数ai(1<
=ai<
=20000)是第i种果子的数目。
输出文件fruit.out包括一行,这一行只包含一个整数,也就是最小的体力耗费值。
输入数据保证这个值小于231。
【样例输入】
3
129
【样例输出】
15
【数据规模】
对于30%的数据,保证有n<
=1000:
对于50%的数据,保证有n<
=5000;
对于全部的数据,保证有n<
=10000。
3、合唱队形(chorus.pas/dpr/c/cpp)
N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。
合唱队形是指这样的一种队形:
设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK,则他们的身高满足T1<
...<
Ti>
Ti+1>
…>
TK(1<
=i<
=K)。
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
输入文件chorus.in的第一行是一个整数N(2<
=N<
=100),表示同学的总数。
第一行有n个整数,用空格分隔,第i个整数Ti(130<
=Ti<
=230)是第i位同学的身高(厘米)。
输出文件chorus.out包括一行,这一行只包含一个整数,就是最少需要几位同学出列。
8
186186150200160130197220
4
【数据规模】对于50%的数据,保证有n<
=20;
=100。
4、虫食算(alpha.pas/dpr/c/cpp)
所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母。
来看一个简单的例子:
43#9865#045
+8468#6633
44445509678
其中#号代表被虫子啃掉的数字。
根据算式,我们很容易判断:
第一行的两个数字分别是5和3,第二行的数字是5。
现在,我们对问题做两个限制:
首先,我们只考虑加法的虫食算。
这里的加法是N进制加法,算式中三个数都有N位,允许有前导的0。
其次,虫子把所有的数都啃光了,我们只知道哪些数字是相同的,我们将相同的数字用相同的字母表示,不同的数字用不同的字母表示。
如果这个算式是N进制的,我们就取英文字母表午的前N个大写字母来表示这个算式中的0到N-1这N个不同的数字:
但是这N个字母并不一定顺序地代表0到N-1)。
输入数据保证N个字母分别至少出现一次。
BADC
+CBDA
DCCC
上面的算式是一个4进制的算式。
很显然,我们只要让ABCD分别代表0123,便可以让这个式子成立了。
你的任务是,对于给定的N进制加法算式,求出N个不同的字母分别代表的数字,使得该加法算式成立。
输入数据保证有且仅有一组解,
输入文件alpha.in包含4行。
第一行有一个正整数N(N<
=26),后面的3行每行有一个由大写字母组成的字符串,分别代表两个加数以及和。
这3个字符串左右两端都没有空格,从高位到低位,并且恰好有N位。
输出文件alpha.out包含一行。
在这一行中,应当包含唯一的那组解。
解是这样表示的:
输出N个数字,分别表示A,B,C……所代表的数字,相邻的两个数字用一个空格隔开,不能有多余的空格。
5
ABCED
BDACE
EBBAA
10342
【数据规模】对于30%的数据,保证有N<
=10;
对于50%的数据,保证有N<
=15;
对于全部的数据,保证有N<
=26。
第十一届全国信息学奥林匹克分区联赛(NOIP2005)复赛试题
1、谁拿了最多奖学金(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个学生获得的奖学金的总数。
YaoLin8782YN0
ChenRuiyi8878NY1
LiXin9288NN0
ZhangQin8387YN1
ChenRuiyi
9000
28700
2、过河(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。
3、篝火晚会(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。
34
43
12
2
对于30%的数据,n<
=1000;
对于全部的数据,n<
=50000。
4、等价表达式(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<
=26),表示选项的个数。
后面n行,每行包括一个选项中的表达式。
这n个选项的标号分别是A,B,C,D……
输入表达式的长度都不超过50个字符,且保证选项中总有表达式和题干中的表达式是等价的。
输出文件equal.out包括一行,这一行包括一系列选项的标号,表示哪些选项是和题干中的表达式等价的。
选项的标号按照字母顺序排列,而且之间没有空格。
(a+1)^2
(a-1)^2+4*a
a+1+a
a^2+2*a*1+1^2+10-10+a–a
AC
对于30%的数据,表达式中只可能出现两种运算符‘+’和‘-’;
对于其它的数据,四种运算符‘+’,‘-’,‘*’,‘^’在表达式中都可能出现。
对于全部的数据,表达式中都可能出现小括号‘(’和‘)’。
第十二届全国信息学奥林匹克分区联赛(NOIP2006)复赛试题
关于竞赛中不同语言使用限制的说明
一.关于使用Pascal语言与编译结果的说明
1.对于Pascal语言的程序,当使用IDE和fpc编译结果不一致时,以fpc的编译结果为准。
2.允许使用数学库(uses
math子句),以及ansistring。
但不允许使用编译开关(最后测试时pascal的范围检查开关默认关闭:
{$R-,Q-,S-}),也不支持与优化相关的选项。
二.关于C++语言中模板使用的限制说明
1.允许使用的部分:
标准容器中的布尔集合,迭代器,串,流。
相关的头文件:
<
bitset
>
iterator
string
iostream
2.禁止使用的部分:
序列:
vector,list,deque
序列适配器:
stack,
queue,
priority_queue
关联容器:
map,
multimap,
set,
multiset
拟容器:
valarray
散列容器:
hash_map,
hash_set,
hash_multimap,
hash_multiset
所有的标准库算法
相关头文件:
vector
list
deque
stack
map
set
algorithm
1.能量项链(energy.pas/c/cpp)
在Mars星球上,每个Mars人都随身佩带着一串能量项链。
在项链上有N颗能量珠。
能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数。
并且,对于相邻的两颗珠子,前一颗珠子的尾标记一定等于后一颗珠子的头标记。
因为只有这样,通过吸盘(吸盘是Mars人吸收能量的一种器官)的作用,这两颗珠子才能聚合成一颗珠子,同时释放出可以被吸盘吸收的能量。
如果前一颗能量珠的头标记为m,尾标记为r,后一颗能量珠的头标记为r,尾标记为n,则聚合后释放的能量为m*r*n(Mars单位),新产生的珠子的头标记为m,尾标记为n。
需要时,Mars人就用吸盘夹住相邻的两颗珠子,通过聚合得到能量,直到项链上只剩下一颗珠子为止。
显然,不同的聚合顺序得到的总能量是不同的,请你设计一个聚合顺序,使一串项链释放出的总能量最大。
例如:
设N=4,4颗珠子的头标记与尾标记依次为(2,3)(3,5)(5,10)(10,2)。
我们用记号⊕表示两颗珠子的聚合操作,(j⊕k)表示第j,k两颗珠子聚合后所释放的能量。
则第4、1两颗珠子聚合后释放的能量为:
(4⊕1)=10*2*3=60。
这一串项链可以得到最优值的一个聚合顺序所释放的总能量为
((4⊕1)⊕2)⊕3)=10*2*3+10*3*5+10*5*10=710。
输入文件energy.in的第一行是一个正整数N(4≤N≤100),表示项链上珠子的个数。
第二行是N个用空格隔开的正整数,所有的数均不超过1000。
第i个数为第i颗珠子的头标记(1≤i≤N),当i<
N时,第i颗珠子的尾标记应该等于第i+1颗珠子的头标记。
第N颗珠子的尾标记应该等于第1颗珠子的头标记。
至于珠子的顺序,你可以这样确定:
将项链放到桌面上,不要出现交叉,随意指定第一颗珠子,然后按顺时针方向确定其他珠子的顺序。
输出文件energy.out只有一行,是一个正整数E(E≤2.1*109),为一个最优聚合顺序所释放的总能量。
【输入样例】
23510
【输出样例】
710
2.金明的预算方案(budget.pas/c/cpp)
金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间。
更让他高兴的是,妈妈昨天对他说:
“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”。
今天一早,金明就开始做预算了,他把想买的物品分为两类:
主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子:
主件
附件
电脑
打印机,扫描仪
书柜
图书
书桌
台灯,文具
工作椅
无
如果要买归类为附件的物品,必须先买该附件所属的主件。
每个主件可以有0个、1个或2个附件。
附件不再有从属于自己的附件。
金明想买的东西很多,肯定会超过妈妈限定的N元。
于是,他把每件物品规定了一个重要度,分为5等:
用整数1~5表示,第5等最重要。
他还从因特网上查到了每件物品的价格(都是10元的整数倍)。
他希望在不超过N元(可以等于N元)的前提下,使每件物品的价格与重要度的乘积的总和最大。
设第j件物品的价格为v[j],重要度为w[j],共选中了k件物品,编号依次为j1,j2,……,jk,则所求的总和为:
v[j1]*w[j1]+v[j2]*w[j2]+…+v[jk]*w[jk]。
(其中*为乘号)
请你帮助金明设计一个满足要求的购物单。
输入文件budget.in的第1行,为两个正整数,用一个空格隔开:
nm
(其中N(<
32000)表示总钱数,m(<
60)为希望购买物品的个数。
)
从第2行到第m+1行,第j行给出了编号为j-1的物品的基本数据,每行有3个非负整数
vpq
(其中v表示该物品的价格(v<
10000),p表示该物品的重要度(1~5),q表示该物品是主件还是附件。
如果q=0,表示该物品为主件,如果q>
0,表示该物品为附件,q是所属主件的编号)
输出文件budget.out只有一个正整数,为不超过总钱数的物品的价格与重要度乘积的总和的最大值(<
200000)。
10005
80020
40051
30051
40030
50020
2200
3.作业调度方案(jsp.pas/c/cpp)
我们现在要利用m台机器加工n个工件,每个工件都有m道工序,每道工序都在不同的指定的机器上完成。
每个工件的每道工序都有指定的加工时间。
每个工件的每个工序称为一个操作,我们用记号j-k表示一个操作,其中j为1到n中的某个数字,为工件号;
k为1到m中的某个数字,为工序号,例如2-4表示第2个工件第4道工序的这个操作。
在本题中,我们还给定对于各操作的一个安排顺序。
例如,当n=3,m=2时,“1-1,1-2,2-1,3-1,3-2,2-2”就是一个给定的安排顺序,即先安排第1个工件的第1个工序,再安排第1个工件的第2个工序,然后再安排第2个工件的第1个工序,等等。
一方面,每个操作的安排都要满足以下的两个约束条件。
(1)对同一个工件,每道工序必须在它前面的工序完成后才能开始;
(2)同一时刻每一台机器至多只能加工一个工件。
另一方面,在安排后面的操作时,不能改动前面已安排的操作的工作状态。
由于同一工件都是按工序的顺序安排的,因此,只按原顺序给出工件号,仍可得到同样的安排顺序,于是,在输入数据中,我们将这个安排顺序简写为“112332”。
还要注意,“安排顺序”只要求按照给定的顺序安排每个操作。
不一定是各机器上的实际操作顺序。
在具体实施时,有可能排在后面的某个操作比前面的某个操作先完成。
例如,取n=3,m=2,已知数据如下:
工件号
机器号/加工时间
工序1
工序2
1
1/3
2/2
1/2
2/5
1/4
则对于安排顺序“112332”,下图中的两个实施方案都是正确的。
但所需要的总时间分别是10与12。
当一个操作插入到某台机器的某个空档时(机器上最后的尚未安排操作的部分也可以看作一个空档),可以靠前插入,也可以靠后或居中插入。
为了使问题简单一些,我们约定:
在保证约束条件
(1)
(2)的条件下,尽量靠前插入。
并且,我们还约定,如果有多个空档可以插入,就在保证约束条件
(1)
(2)的条件下,插入到最前面的一个空档。
于是,在这些约定下,上例中的方案一是正确的,而方案二是不正确的。
显然,在这些约定下,对于给定的安排顺序,符合该安排顺序的实施方案是唯一的,请你计算出该方案完成全部任务所需的总时间。
【