首页 > 代码库 > noip2004提高组题解
noip2004提高组题解
这次有两道题以前已经做过了,所以分数什么的也没有意义了。发现这年的难度设置极不靠谱,前三题都比较简单,最后一题太难,不知道出题人怎么想的。
第一题:储蓄计划
模拟。
第二题:合并果子
贪心。每次选最小的两堆合并。
第三题:合唱队形
两次动规。题目可以转化为找出一个人,使得以他为尾的最长上升子序列的长度最大,并且以他为首的最长下降子序列的长度也最大。
第四题:虫食算
马上想到搜索。但是规模太大,N可能有26位,如果简单枚举那么运算次数是26!≈4e27;剪枝方面只想到一个很弱的剪枝(对于26的规模而言这样的剪枝远远不够):
* 若 a+b+1<c 则回溯(因为进位最多为1)
这样只能过7个点。
后来搜索了一下发现这个剪枝可以更进一步:
* 若 a+b mod n ≠ c 且 a+b+1 mod n ≠ c 则回溯
但是优化效果不明显,还是只能过7个点。
继续百度:
* 如果已经确定了某一位上三个数中的两个,则可以推出第三个数的两种可能值,若两个值都已经被“占用”了则回溯
在网上还找到一个很强力的剪枝:(但是我一开始看到这方法感觉很麻烦就拖了很长时间都没有实现,最后静下心来分析了一下发现其实并不繁)
* 不要依次枚举A,B,C...对应的数字,而是式子后面的字母优先枚举
(后面的字母优先枚举就可以让式子从后面开始慢慢填充,尽早判断出不可能的情况。如果从A到B到C顺序下去,式子的填充是很零散的,效率极低,对于有些数据需要填充到快结束的时候才能判断出这种情况的可行性)
这道题有一个很坑的地方:对于N>10的进制,9之后不必用A,B,C,D...来表示,直接输出10,11,12,13...即可。这!T!M!一!定!是!在!玩!我!哪有不用字母表示十六进制的!!!
经验教训:
1. 要多积累剪枝技巧;
2. 做题的时候千万不能听音乐!尤其是小苹果!!!