NOIP2002-2005解题报告
- 格式:doc
- 大小:285.50 KB
- 文档页数:29
NOIP讲义一、NOIP2002题一:均分纸牌(NOIPG1)【问题描述】有N堆纸牌,编号分别为1, 2, ..., N-1。
每堆上有若干张,但纸牌总数必为N的倍数,可以在任一堆上取若干张,s然后移动。
移牌规则为:在编号为1堆上取的纸牌,只能移到编号为2的对上;在编号为N的堆上取的纸牌,只能移到编号为N-1的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。
现在要求找出一种移动方法,用最少的移动次数使每堆上的纸牌数都是一样多。
输入:文件名: G1.In第一行,为一个整数N(1<=N<=100)第二行,为N个整数A1, A2,…AN(N堆纸牌初始数, 1<=Ai<=10000,中间用空格分开)输出: 文件名:G2.Out只有一行,所有堆均达到相等时的最少移动次数。
输入输出样例G1.In49 8 17 6G2.Out3【问题分析】本题实际上给我们N个数A1,A2,A3,……,A N(A1+A2+A3+……+A N是N的倍数),要求我们利用一个简单的移动规则,即对于一个A I和A I+1(1≤I≤N-1),可以从A I中移X至A I+1(即A I=A I-X且A I+1=A I+1+X)(-A I+1≤X≤A I),使最后A1=A2=A3=……=A N;首先,通过A1,A2,A3,……,A N我们很容易想到先求出A1~A N的平均值___A,然后从左至右,若A I≠___A,则使A I+1=A I+1+A I-___A ,A I=___A。
例如试题给我们的例点A1=9 A2=8 A3=17 A4=6,我们先计算出___A=10,然后通过以下3步即可得出A1=A2=A3=A4①因A1≠___A,使A2=A2+A1-___A=7,A1=___A=10(10 7 17 6)②因A2≠___A,使A3=A3+A2-___A=14,A2=___A=10(10 10 14 6)③因A3≠___A,使A4=A4+A3-___A=10 A3=___A=10(10 10 10 10,A1=A2=A3=A4)。
但是,这种贪心方法有时会出现与实际不合的情况,例如N=3,A1=1,A2=2,A3=27此时,我们的步骤为,计算___A=(1+2+27)/3=10,①因A1≠___A,使A2=A2+A1-___A=1+2-10=-7,A1=___A=10,②因A2≠___A,使A3=A3+A2-___A=10,A4=___A=10,但是,我们发现:①中,第二堆牌中有负数张,这是不可能的。
是不是这种贪心方法有错误呢?我们再来考虑,对于上面的情况,我们可以①从A3拿17至A2,(1,19,10)②从A2拿9至A1(10,10,10),通过观察,我们发现,用贪心法和后一种正确的方法所移动的牌是一样的,即都从A3移17至A2,从A2移9至A1。
是不是对于所有的数据都会符合呢?答案是肯定的,事实上,从A1考虑,若A1>___A,则不管怎样,它必须将A1-___A给A2,若A1<___A,则不管怎样,它必须从A2得到AX=___A-A1,若A2≥AX,则可直接从A2中取AX给A1,否则,相当于对A2~A N进行调整,使A2=___A+AX,A3=A4=……=A N=___A,这样就相当于一个递归的过程,事实上,A I和A I+1最后都最多进行一次传递,所以,我们最初的贪心是正确的。
题二字串变换(NOIPG2)【问题描述】已知有两个字串A$,B$及一组字串变换的规则(至多六个规则) :A1$——>B1$A2$——>B2$规则的含义为:在A$中的子串A1$可以变换为B1$,A2$可以变换为B2$……。
对于给定的A$,B$以及变换规则,求出从A$变换到B$所需的最少步数。
输入:文件名: G2.In第1行,为两个字串A$ B$(用空格分开)第2行以后的每行为两个字串A1$ B1$(用空格分开),表示一种变换规则所有字符串长度的上限为20。
输出:文件名:G2.Out只有1行,若在10步以内有解,输出最少步数,否则输出”No ANSWER!”。
输入输出样例:G2.Inabcd xyzabc xuud yy yzG2.Out3【问题分析】本题给了我们两个字符串A$、B$和最多六条变换规则,要求我们用这组变换规则,将A$变为B$。
因为本题不具有最优子结构性质,且状态较难描述,所以动态规划、贪心等算法都无法使用,只好考虑搜索。
用深搜还是广搜呢?若用广搜,因最多有6条变换规则,每个字串长度为20,故每个字串最多有6*20=120种变换方法,如果变10次,则最多有12010>1020,这显然无法存储,因此我们只好考虑深搜。
用这样毫无剪枝的搜索效率是不高的,可以加入两条剪枝,来提高效率。
剪枝一:当前得到的串的长度加上规则中增长最长的与所剩步数的积(即最多还能增长的长度)还小于目标串长则可减掉。
当前得到的串长度减去规则中减长最长的与所剩步数的积(即最多能减长的长度)还大于目标串长则可减掉。
剪枝二:可以给扩展串定一个开始位置,开始位置定为上次扩展的时候与之匹配的位置,从这个位置开始找能变换的,开始位置前面的不作变换。
如当前串为abcdabcefg,有规则abc efg,则当前如果把第一个abc变换成efg,则将扩展出来的节点开始位置定为第1位,如果当前是把第2个abc变换成efg,则把扩展出来的节点开始位置定为第5位,因为如果下次再把第1个abc变换成efg的话就会和先变换第1个再变换第2个重复,可以剪枝。
这道题加入这两条剪枝后速度会快很多。
题三:自由落体(NOIPG3)【问题描述】在高为H的天花板上有N个小球,体积不计,位置分别为0, 1, 2, …, N-1。
在地面上有一个小车(长为L,高为K,距原点距离为S1)。
已知小球下落距离V前进。
小车与所有小球同时开始运动,当小球距小车的距离<=0.00001时,即认为小球被小车接受(小球落到地面后不能被接受)请你计算出小车能接受到多少个小球。
数据范围:1<=H,S1,V,L,K,N<=100000输入:文件名: G3.In只有1行,为6个数H,S1,V,L,K,N(1<= H,S1,V,L,K,N<=100000,中间用空格分开)输出:文件名:G4.In只有1行,为小车能接受到的小球个数。
输入输出样例:G3.In5.0 9.0 5.0 2.0 1.8 5G3.Out1【问题分析】如上图:题中给了我们N个小球和一辆小车,小球的位置分别为0,1,2,……,N-1,距地面H,体积不计,小车宽L,高K。
小车和小球都从0时刻开始运动,小球做自由落体运动,小车从S1开始以速度V向O做匀速直线运动,当小球与小车的距离≤10-5时,任为小球被小车接受,问给出H,S1,V,L,K,N后,有多少个小球被小车接受。
因为小球是按顺序排列的,且开始下落的时间、高度,下落时的加速度都是相同的,若且d I表示小车到达第I个小球所在位置时第I个小球所下落的距离,t I表示小车到达小球I所在位置的时间,由d=1/2*g*t2得:d I=1/2*g*t I2,d I+1=1/2*g*t I+12,d I+2=1/2*g*t I+22,因小车的方向不变,如果小车经过第I个、第I+1个和第I+2个小球,那么t I≥t I+1≥t I+2≥0,则d I≥d I+1≥d I+2,若小车能接住第I个和第I+2个小球,则它必能接住第I+1个小球。
同理,若小球能接住第I个小球和第I+K(K≥0)个小球,则它必能接住第I+1至第K-1个小球。
据此,我们只须求出小车能接住的第一个小球的时间和小车能接住的最后一个小球的时间即可求出小车能接住多少个小球。
对于找第一个和最后一个接住的球,直接计算可能会出现误差,所以不防用二分法。
即对于一个小球I,若小车到I时小球已落地,则第一个接住和最后一个被接住的必在小球I的右边,若小车离开位置I时小球I还在空中,则第一个和最后一个被接住的必在小球I的左边,否则,第一个被接住的小球是I或在I的右边,最后一个被接住的小球是I或在I的左边。
题四:矩形覆盖(NOIPG4)在平面上右N个点,每个点用一对整数坐标表示。
这些点可以用K个矩形全部覆盖,矩形的边平行于坐标轴。
当N个点的坐标和K给出后,怎样才能使得覆盖所有点的K个矩形的面积之和为最小呢。
约定:覆盖一个点的矩形面积为0;覆盖平行于坐标轴的直线上点的矩形面积也为0;各个矩形必须完全分开(边线与顶点也都不能重合)。
输入:文件名:G4.In第一行,为2个整数N K(1<=N<=50, 1<=K<=4,用空格分开)。
攻击第2~N+1行,每行为2个整数X, Y, 为平面上1个点的坐标(0 <= X, Y <= 500,中间用空格分开)。
输出:文件名: G4.Out只有1行,为一个整数,即满足条件的最小的矩形面积之和。
输入输出样例:G4.In4 21 12 23 607G4.Out4【问题分析】本题给了我们平面上的n个点(n≤50),每个点用一对整数坐标表示,要求我们用k个矩形(1≤k≤4)将这些点全部覆盖,矩形的边平行于坐标轴。
并且:覆盖一个点的矩形面积为0;覆盖平行于坐标轴直线上点的矩形面积也为0。
各个矩形必须完全分开(边线与顶点也都不能重合)。
本题是此次竞赛中一道比较难的题目,因其是对平面上的点进行操作,若用搜索做,状态难以描述;用贪心做,不太可行……用动态规划做,也不能保证全对,但是,较之其他方法,动态规划也还能算得上“矮子里的高子”,因此,这道题目只好用动态规划来解决。
假设:符合题目要求的矩形压缩到坐标轴后(即在坐标轴上的射影)在X轴不相交或在Y轴不相交。
例如例点可如将矩形压缩成如下形式:其中,绿色表示S1的射影,蓝色表示S2的射影。
虽然我们不能保证所有的情况都能满足,但是大部分情况它都能找出最优解。
这样,以X坐标或Y坐标为状态,我们就可以很快写出动态转移方程了:以X坐标为状态:F[I, J] = F[I – 1, K] + Cost1[K + 1, J]; 其中Cost1[A, B]表示按X 坐标排序后从PA到PB的矩形的面积。
以Y坐标为状态:F[I, J] = F[I – 1, K] + Cost2[K + 1, J]; 其中Cost2[A, B]表示按Y 坐标排序后从PA到PB的矩形的面积。
二、NOIP2003题一:神经网络(Network )【问题描述】人工神经网络(Artificial Neural Network )是一种新兴的具有自我学习能力的计算系统,在模式识别、函数逼近及贷款风险评估等诸多领域有广泛的应用。