noip2009提高组题解
第一题:潜伏者
模拟
注意点:
- 不同的密文对应的明文不同,反过来,不同的明文对应的密文也不同,我用了两个hash表来实现;
- 26个明文字母必须有对应的密文字母,我用了两个计数变量来判断是否26个字母都有匹配。
第二题:Hankson的趣味题
数论
对 a0, a1, b0, b1 四个数进行质因数分解,然后确定 x 的各质因数的指数的取值范围,运用乘法原理解决。详细分析见下:
(引用自http://wenwen.sogou.com/z/q169562042.htm)
Gcd(x,a0)=a1, Gcd(x,b0)=xb0/b1
设f(a,b) 代表b这个质因子在a中有多少个.
对于a0的任意质因子t, 若f(a0,t)=f(a1,t) 则只需保证f(x,t)≥f(a1,t), 否则f(x,t)=f(a1,t)
对于b1的任意质因子t, 若f(b1,t)=f(b0,t) 则只需保证0≤f(x,t)≤f(b1,t), 否则f(x,t)=f(b1,t)
由于x的所有因子都是b1的子集, 所以我们只需对b1的质因子按如上方法逐个检查这个质因子在x里面的取值范围(若为空则说明无解), 并按照乘法原理统计即可.
关于分解质因子: 由于b1不会超过2*10^9, 大于50000的质因子不会超过1个, 所以我们只要打出50000以内的素数表即可, 若最后除剩的b1仍未除尽, 说明此时b1一定是一个大于50000的素数.(很巧妙的思想)
这一题的思路如果光用文字描述会很吃力,用上恰当的表示方法就能得到很清晰的逻辑过程,从而解出题目。而我就是因为没有将思路转换为清楚的表达式,所以在做这道题时花费了很多时间。
第三题:最优贸易
最短路
对于每一个点i,统计出从1到i最小的买进价格与从n到i(边反向)最大的卖出价格。
这个过程借助求最短路的SPFA算法实现,写法基本相同,只是「松弛」操作的含义发生了变化。而我一开始以为用DFS也能求出最大最小值,但是由于同一个点可能多次更新再加上有双向边,DFS无法处理(要么死循环,在双向边上一直来去;要么WA,因为限制了更新次数就有可能无法得到正解;当然如果把允许更新的次数稍微设置大一点也许也能AC),所以还是不得不用了SPFA。
第四题:靶形数独
搜索
没有加剪枝,事实上能想到的剪枝也完全不起作用。所以只能卡时。网上有贪心+卡时的策略,这样可以比较容易AC。而我没有用贪心优化,直接卡时,只是搜索顺序改成从后往前,但是卡时变量的大小不好掌控,尝试了很多次才把所有数据AC。
经验教训:
- 最好将思路转换为简洁易懂的表达式(如T2),这样有助于更好地解题;
- 考场上贪心+卡时是非常好的策略,能够拿到不少分数。