复赛noip2010提高组题解[新版]
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.
translate(20分)
简单模拟。
开一个1000的队列,时刻保持队列长度不大于M,每次接受翻译请求时,先在队列中查找,查找失败则将单词加入队列。
查找使用Hash则为O(N),直接扫描O(MN),都在可接受范围内。
考试时只打了20分,原因至今不明,告诫大家对于水题不要多想,就像这道题最好不开hash,因为一个系统的可靠度是该系统所有子系统可靠度之积,程序越复杂越可能出错。
4.tortoise(50分)
基础动规。
可以从题目背景中抽象出这样的问题:
有一四维立方体(这里的立方体棱长不必相等,每一维对应一种卡片,每维的棱长对应该种卡片个数),每走一格(即使用一张卡片)的收益是当前位置坐标的函数。
求从(0,0,0,0)走到(a1,a2,a3,a4)最大收益。
故有方程
f[x,y,z,t]=max{
f[x-1,y,z,t], f[x,y-1,z,t], f[x,y,z-1,t], f[x,y,z,t-1]
} + w[1 + x + y*2 + z*3 + t*4]
目标状态: f[a1,a2,a3,a4]
O(b^4)的代价,数据保证b<=40,完全满足要求
5.prison(70分)
问题可以重新描述为:寻找最小的冲突值c,使得存在一种方案,将原图分为两部分,并去掉这两部分之间的所有边后,余下的边权都不大于c。
对于这个问题我们可以二分查找c,并判定其可行性。
判定可行性的方法至今没想好。
考试的时候我是用并查集,将所有与u相连并与u之间边权大于c的点(设为点集Zu)必然不与u在同一集合中,枚举所有的u,每次将Zu合并成为一个集合,若存在某点u和Zu某个点处于同一个集合中,则c不可行,反之则可行。
但这种方法貌似存在bug,能拿70分。
如果把并查集合并查找的时间代价看作常数,则这种做法的时间代价为O(elogK),e是边数,K为最大的冲突值。
6.flow(100分)
先用floodfill预处理出上方的每个格子能覆盖到下方的格子,构造一个布尔矩阵,行下标表示最上方的某个点,列下标表示最下方的某个点,矩阵对应点的值
表示相应两个点的覆盖关系。
回想BYTELAND射击竞赛一题,可以发现这道题是有贪心策略的。
为了描述方便,这里把布尔矩阵看作一个二分图U-D的压缩邻接矩阵,其中最上方与水源相邻
方与沙漠相邻的点集为D。
如
中某个点入度为0,则不存在
的建立方式。
贪心策略:
A.每次选择D中入度最小的,设为u。
B.选择U集合中与u相连并且出度最大的点v。
C.在v处建立水源设施,并从二分图中删去v和与v相连的所有点、边。
D.重复ABC,直至D集合为空
可以证明,以这样的贪心策略构造的建立方式一定是最优的。
这样,floodfill时间代价O(NM^2)(可以通过记忆化优化至O(NM),但不是很必要),贪心部分最多执行M次,每次贪心需要扫描出入度表和布尔矩阵的一行一列,时间代价O(M^2),总的时间代价在立方级,勉强可以接受。
时间分配(可以看出很不合理):
translate : 5min
tortoise : 110min
prison : 10min
flow : 30min
考试感言:
NOIP’10难度和去年相仿,思维量可能略大一些。
去年缺席的动规今年回归,表明动态规划仍是NOIP的重要考点。
1、2两题杯具了,导致整套题分数拉低了不少,没进省队,有点遗憾。
不过拿1=走人也是个不错的选择。
就当我是在DP吧,局部次优解导致了全局最优解。
这次我的时间分配不够合理。
开始读题的时候把第二题当作多重背包了,所以打算30min内刷完1、2两题。
等到上手第二题的时候才发现思路不正确。
然后我的思路就被局限在了背包问题上,之后的三、四题的编码过程都是穿插在第二题的思考过程中的。
但是到最后也没想出来第二题的正解,反而耽误了很多检查时间,最后剩20min的时候我才决定把第二题定型在50分程序上。
这也间接导致了我由于没时间出有技巧的测试数据而在第一题上栽跟头。
再说一句,写DP方程一定要查冗余状态,我做第二题的时候的最终思路类似正解,但多加了一个冗余状态,即距出发点的距离d。
但显然d=x+y*2+z*3+t*4,这一维被其余四维唯一确定。
虽然我用的是记忆化搜索,冗余的状态空间不影响程序速度,但是多出的一维直接导致后50分内存溢出,只拿了一半分数。
NOIP2010。