noip集训练习 Day4.docx
《noip集训练习 Day4.docx》由会员分享,可在线阅读,更多相关《noip集训练习 Day4.docx(15页珍藏版)》请在冰豆网上搜索。
![noip集训练习 Day4.docx](https://file1.bdocx.com/fileroot1/2022-11/26/9da10758-7acb-439b-8b2d-c075179aaeeb/9da10758-7acb-439b-8b2d-c075179aaeeb1.gif)
noip集训练习Day4
1.动态规划:
导弹拦截NOIP1999(提高组)第一题
【问题描述】
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。
但是这种导弹拦截系统有一个缺陷:
虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。
某天,雷达捕捉到敌国的导弹来袭。
由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。
【输入文件】missile.in
单独一行列出导弹依次飞来的高度
【输出文件】missile.out
两行,分别是最多能拦截的导弹数,要拦截所有导弹最少要配备的系统数
【输入样例】
38920715530029917015865
【输出样例】
6
2
2.合唱队型NOIP2004(提高组)第一题
N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。
合唱队形是指这样的一种队形:
设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK, 则他们的身高满足T1<...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;
对于全部的数据,保证有n<=100。
3.装箱问题NOIP2001(普及组)第四题
【问题描述】
有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30=,每个物品有一个体积(正整数)。
要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
【输入文件】
第一行一个正整数V表示箱子的容量,第二行一个正整数N表示物品个数,接下来N行列出这N个物品各自的体积。
【输出文件】
单独一行,表示箱子最小的剩余空间。
【输入样例】
24
6
8
3
12
7
9
7
【输出样例】
0
4.砝码称重
NOIP1996(提高组) 第四题
【问题描述】
设有1g、2g、3g、5g、10g、20g的砝码各若干枚(其总重<=1000),用他们能称出的重量的种类数。
【输入文件】
a1 a2 a3 a4 a5 a6
(表示1g砝码有a1个,2g砝码有a2个,…,20g砝码有a6个,中间有空格)。
【输出文件】
Total=N
(N表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况)。
【输入样例】
110000
【输出样例】
TOTAL=3
5.积木城堡
XC的儿子小XC最喜欢玩的游戏用积木垒漂亮的城堡。
城堡是用一些立方体的积木垒成的,城堡的每一层是一块积木。
小XC是一个比他爸爸XC还聪明的孩子,他发现垒城堡的时候,如果下面的积木比上面的积木大,那么城堡便不容易倒。
所以他在垒城堡的时候总是遵循这样的规则。
小XC想把自己垒的城堡送给幼儿园里漂亮的女孩子们,这样可以增加他的好感度。
为了公平起见,他决定把送给每个女孩子一样高的城堡,这样可以避免女孩子们为了获得更漂亮的城堡而引起争执。
可是他发现自己在垒城堡的时候并没有预先考虑到这一点。
所以他现在要改造城堡。
由于他没有多余的积木了,他灵机一动,想出了一个巧妙的改造方案。
他决定从每一个城堡中挪去一些积木,使得最终每座城堡都一样高。
为了使他的城堡更雄伟,他觉得应该使最后的城堡都尽可能的高。
请你帮助小XC编一个程序,根据他垒的所有城堡的信息,决定应该移去哪些积木才能获得最佳的效果。
【输入文件】
第一行是一个整数N(N<=100),表示一共有几座城堡。
以下N行每行是一系列非负整数,用一个空格分隔,按从下往上的顺序依次给出一座城堡中所有积木的棱长。
用-1结束。
一座城堡中的积木不超过100块,每块积木的棱长不超过100。
【输出文件】
一个整数,表示最后城堡的最大可能的高度。
如果找不到合适的方案,则输出0。
【输入样例】
2
21–1
321-1
【输出样例】
3
6.采药:
【问题描述】
辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。
为此,他想拜附近最有威望的医师为师。
医师为了判断他的资质,给他出了一个难题。
医师把他带到一个到处都是草药的山洞里对他说:
“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。
我会给你一段时间,在这段时间里,你可以采到一些草药。
如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。
”
如果你是辰辰,你能完成这个任务吗?
【输入文件】
输入文件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。
7.金明的预算方案
NOIP2006第二题
【问题描述】
金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间。
更让他高兴的是,妈妈昨天对他说:
“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过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
8.MoneySystemsUSACO2.3
【问题描述】
母牛们不但创建了他们自己的政府而且选择了建立了自己的货币系统。
他们对货币的数值感到好奇。
传统地,一个货币系统是由1,5,10,20或25,50,和100的单位面值组成的。
母牛想知道有多少种不同的方法来用货币系统中的货币来构造一个确定的数值。
举例来说,使用一个货币系统{1,2,5,10,...}产生18单位面值的一些可能的方法是:
18x1,9x2,8x2+2x1,3x5+2+1,等等其它。
写一个程序来计算有多少种方法用给定的货币系统来构造一定数量的面值。
保证总数将会适合longlong(C/C++)和Int64(FreePascal)。
【输入文件】
货币系统中货币的种类数目是V(1<=V<=25)。
要构造的数量钱是N(1<=N<=10,000)。
第1行:
二整数,V和N
第2行:
可用的货币V个整数。
【输出文件】
单独的一行包含那个可能的构造的方案数。
【输入样例】
310
125
【输出样例】
10
9.数塔问题
IOI94
【问题描述】
考虑在下面被显示的数字金字塔。
写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大。
每一步可以走到左下方的点也可以到达右下方的点。
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
在上面的样例中,从7到3到8到7到5的路径产生了最大和:
30
【输入文件】
第一个行包含R(1<=R<=1000),表示行的数目。
后面每行为这个数字金字塔特定行包含的整数。
所有的被供应的整数是非负的且不大于100。
【输出文件】
单独的一行包含那个可能得到的最大的和。
【输入样例】
5
7
38
810
2744
45265
【输出样例】
30
10.Henry捡钱
最近,Henry由于失恋(被某大牛甩掉!
)心情很是郁闷.所以,他去了大牛家,寻求Michael大牛的帮助,让他尽快从失恋的痛苦中解脱出来.Michael大牛知道Henry是很爱钱的,所以他是费尽脑水,绞尽脑汁想出了一个有趣的游戏,帮助Henry.....
Michael感觉自己简直是个天才(我们从不这么认为),就把这个游戏取名为:
Henry拣钱.为了帮助更多的人采用这种方法早日脱离失恋之苦,Michael特地选在这次DT比赛中把游戏介绍给大家...(大家鼓掌!
!
!
)
其实,这个游戏相当垃圾,目的就是为了满足Henry这种具有强烈好钱的心理的人.游戏是这样的:
Michael首先找到了一块方形的土地,面积为m*n(米^2).然后他将土地划分为一平方米大小的方形小格.Michael在每个格子下都埋有钱(用非负数s表示,表示人民币的价值为s)和炸弹(用负数s表示,表示Henry挖出该方格下的东西会花掉s的钱去看病,医炸弹炸伤的伤口)...游戏的要求就是让Henry从一侧的中间列出发,按照下图的5种方式前进(前进最大宽度为5),不能越出方格.他每到一个格子,必定要取走其下相应的东西.直到到达土地的另一侧,游戏结束.不用说也知道,Henry肯定想得到最多的人民币.所以他偷窥了,Michael埋钱的全过程,绘成了一张距阵图.由于他自己手动找会很麻烦,于是他就找到了学习编程的你.请给帮他找出,最大人民币价值.
拣钱路线规则(只有5个方向,如下图):
H为Henry的出发点,每组数据的出发点都是最后一行的中间位置!
(前方5个格子为当前可以到达的)
【输入文件】
第一行为mn.(n为奇数),入口点在最后一行的中间
接下来为m*n的数字距阵.
共有m行,每行n个数字.数字间用空格隔开.代表该格子下是钱或炸弹.
为了方便Henry清算,数字全是整数.
【输出文件】
一个数,为你所找出的最大人民币价值.
【输入样例】
67
164312603
4-567002
60-1-2368
53400-27
-17407-56
0-1341242
【输出样例】
51
【数据范围】
NandM<=200
11.乌龟棋
【问题描述】
小明过生日的时候,爸爸送给他一副乌龟棋当作礼物。
乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数)。
棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点。
乌龟棋中M张爬行卡片,分成4种不同的类型(M张卡片中不一定包含所有4种类型的卡片,见样例),每种类型的卡片上分别标有1、2、3、4四个数字之一,表示使用这种卡片后,乌龟棋子将向前爬行相应的格子数。
游戏中,玩家每次需要从所有的爬行卡片中选择一张之前没有使用过的爬行卡片,控制乌龟棋子前进相应的格子数,每张卡片只能使用一次。
游戏中,乌龟棋子自动获得起点格子的分数,并且在后续的爬行中每到达一个格子,就得到该格子相应的分数。
玩家最终游戏得分就是乌龟棋子从起点到终点过程中到过的所有格子的分数总和。
很明显,用不同的爬行卡片使用顺序会使得最终游戏的得分不同,小明想要找到一种卡片使用顺序使得最终游戏得分最多。
现在,告诉你棋盘上每个格子的分数和所有的爬行卡片,你能告诉小明,他最多能得到多少分吗?
【输入】
输入文件名tortoise.in。
输入文件的每行中两个数之间用一个空格隔开。
第1行2个正整数N和M,分别表示棋盘格子数和爬行卡片数。
第2行N个非负整数,
其中
表示棋盘第i个格子上的分数。
第3行M个整数,
表示M张爬行卡片上的数字。
输入数据保证到达终点时刚好用光M张爬行卡片,即N−1=
【输出】
输出文件名tortoise.out。
输出只有1行,1个整数,表示小明最多能得到的分数。
【输入输出样例1】
tortoise.in
tortoise.out
95
6101428818517
13121
73
小明使用爬行卡片顺序为1,1,3,1,2,得到的分数为6+10+14+8+18+17=73。
注意,由于起点是1,所以自动获得第1格的分数6。
【输入输出样例2】
tortoise.in
tortoise.out
138
49610645513945352489830
11111241
455
【数据范围】
对于30%的数据有1≤N≤30,1≤M≤12。
对于50%的数据有1≤N≤120,1≤M≤50,且4种爬行卡片,每种卡片的张数不会超过20。
对于100%的数据有1≤N≤350,1≤M≤120,且4种爬行卡片,每种卡片的张数不超过40;0≤ai≤100,1≤i≤N;1≤bi≤4,1≤i≤M。
输入数据保证N−1=
区间动归
合并石子
【问题描述】
在一个操场上摆放着一行共n堆的石子。
现要将石子有序地合并成一堆。
规定每次只能选相邻的两堆合并成新的一堆,并将新的一堆石子数记为该次合并的得分。
请编辑计算出将n堆石子合并成一堆的最小得分和将n堆石子合并成一堆的最大得分。
【输入文件】
输入第一行为n(n<1000),表示有n堆石子,第二行为n个用空格隔开的整数,依次表示这n堆石子的石子数量(<=1000)
【输出文件】
输出将n堆石子合并成一堆的最小得分和将n堆石子合并成一堆的最大得分。
【输入样例】
3
123
【输出样例】
911
贪心失效例子:
3 4 6 5 4 2
5 4 6 5 4 得分:
5
9 6 5 4 得分:
9
9 6 9 得分:
9
15 9 得分:
15
24 得分:
24
总得分:
62
合理方案
3 4 6 5 4 2
7 6 5 4 2 得分:
7
7 6 5 6 得分:
6
7 11 6 得分:
11
13 11 得分:
13
24 得分:
24
总得分:
61
能量项链
【问题描述】
在Mars星球上,每个Mars人都随身佩带着一串能量项链。
在项链上有N颗能量珠。
能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数。
并且,对于相邻的两颗珠子,前一颗珠子的尾标记一定等于后一颗珠子的头标记。
因为只有这样,通过吸盘(吸盘是Mars人吸收能量的一种器官)的作用,这两颗珠子才能聚合成一颗珠子,同时释放出可以被吸盘吸收的能量。
如果前一颗能量珠的头标记为m,尾标记为r,后一颗能量珠的头标记为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颗珠子的尾标记应该等于第1颗珠子的头标记。
至于珠子的顺序,你可以这样确定:
将项链放到桌面上,不要出现交叉,随意指定第一颗珠子,然后按顺时针方向确定其他珠子的顺序。
【输出文件】
输出文件energy.out只有一行,是一个正整数E(E≤2.1*109),为一个最优聚合顺序所释放的总能量。
【输入样例】
4
2 3 5 10
【输出样例】
710
盖房子
冯老师最近得到了面积为n*m的一大块土地,他想在这块土地上建造一所房子,这个房子必须是正方形的。
但是,这块土地并非十全十美,上面有很多不平坦的地方(也可以叫瑕疵)。
这些瑕疵十分恶心,以至于根本不能在上面盖一砖一瓦。
他希望找到一块最大的正方形无瑕疵土地来盖房子。
不过,这并不是什么难题,冯老师在10分钟内就轻松解决了这个问题。
现在,你也来试试吧。
【输入文件】
输入文件第一行为两个整数n,m(1<=n,m<=1000),接下来n行,每行m个数字,用空格隔开。
0表示该块土地有瑕疵,1表示该块土地完好。
【输出文件】
一个整数,最大正方形的边长。
【输入样例】
44
0111
1110
0110
1101
【输出样例】
2
加分二叉树
【问题描述】
设一个n个节点的二叉树tree的中序遍历为(l,2,3,…,n),其中数字1,2,3,…,n为节点编号。
每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都有一个加分,任一棵子树subtree(也包含tree本身)的加分计算方法如下:
subtree的左子树的加分×subtree的右子树的加分+subtree的根的分数
若某个子树为空,规定其加分为1,叶子的加分就是叶节点本身的分数。
不考虑它的空
子树。
试求一棵符合中序遍历为(1,2,3,…,n)且加分最高的二叉树tree。
要求输出;
(1)tree的最高加分
(2)tree的前序遍历
【输入格式】
第1行:
一个整数n(n<30),为节点个数。
第2行:
n个用空格隔开的整数,为每个节点的分数(分数<100)。
【输出格式】
第1行:
一个整数,为最高加分(结果不会超过4,000,000,000)。
第2行:
n个用空格隔开的整数,为该树的前序遍历。
【输入样例】
5
571210
【输出样例】
145
31245
滑雪
冯老师喜欢滑雪。
他来到了一个滑雪场,这个滑雪场是一个矩形,为了简便,我们用r行c列的矩阵来表示每块地形。
为了得到更快的速度,滑行的路线必须向下倾斜。
例如样例中的那个矩形,可以从某个点滑向上下左右四个相邻的点之一。
例如24-17-16-1,其实25-24-23…3-2-1更长,事实上这是最长的一条。
输入格式InputFormat
输入文件
第1行:
两个数字r,c(1<=r,c<=100),表示矩阵的行列。
第2..r+1行:
每行c个数,表示这个矩阵。
输出格式OutputFormat
输出文件
仅一行:
输出1个整数,表示可以滑行的最大长度。
输入样例1:
55
12345
161718196
152425207
142322218
131211109
输出样例1:
25