NOIP-2009-提高-题解
By 冯英杰
博客:http://blog.csdn.net/fengyingjie2/
1Spy
1.1 算法一
这道题只需要注意以下几点:
1、原信息每个大写字母出现过。
2、同一个大写字母对应的密码必须相同
字符串的处理要小心,不要粗心大意。
期望得分:100
2Son
2.1 算法一
因为1≤a0,a1,b0,b1≤10000,且x是一个不超过b1的正整数,所以我们枚举输出即可。
时间复杂度O(b1*n) 期望得分:50
2.2 算法二
因为x与b0的最小公倍数是b1,由此可以得到,x一定是b1的因数,所以我们可以枚举,再判断一下它与a0,a1的关系即可。这里的因数有2种方法:
1、直接把i枚举到n的开方,然后对于他的另一半(b1/i)和自己(i)进行判断即可,但是时间复杂度很高。
2、我们可以分解质因数,然后递归出他的因数,这样显然能快一点。
时间复杂度O(b1开方*n) 期望得分:90~100
2.3 算法三
以上方法可能得不到满分,在这里介绍一个数学方法以此进行优化:
Gcd(x,a0)=a1,两边同时除一个a1即可得到gcd(x/a1,a0/a1)=1。这时候,我们就可以做一个判断,x&a0必定是a1的倍数,若符合,在判断公约数是否为1即可。
Lcm(x,b0)=b1,那么在此之前我们还是考虑他的公约数:
Gcd(x,b0)=x*b0/b1(Why?两个数的最大公约数和最小公倍数的乘积即为两数之积)简化可以变成gcd(x/(x*b0/b1),b0/(x*b0/b1))=1,化简得到gcd(b1/b0,b1/x)=1,由此,与之前一样,b1是x&b0的倍数。
综上可以得到,b1必定也是a1的倍数。
最后,结合算法二的方法,此题50%可以过出(pascal请卡常数)
3 Trade
3.1 算法一
递归他的路径,可以加记忆化,判断一下即可。
期望得分:20~30
3.2 算法二
看一下如下的图:
这应该就是那个人走的一个路径,我们可以从他的路径中选取出一个点,设这个点为x,那么1-x的最小值和x-n的最大值,相减,即为他的最大利润值了。
我们可以采取SPFA的方法,只要在判断最短路的时候,切换成最大点或者最小点即可。有的人可能不明白,画个图吧。
最后判断终点走到某个地方的时候,因为是倒过来走的,所以所有的边都要反向,才可以实现。
时间复杂度O(4m+n) 期望得分:100
4 Sudoku
看似很难,实际很简单,认真看看,真的很简单
4.1 算法一
直接暴力递归,然后预处理每个数的系数,他的九宫格,及其行和列的某个数出现过没即可。
时间复杂度O(9^0的个数)实际没有这么多 期望得分:70~80
4.2 算法二
学长说,有时候如果没有什么有用的优化了,可以尝试换一个顺序进行优化,果然对了,倒着搜。以为这样,你当前点选的少,以后的点自然只是这样的几个分支,分支不会很多,每个分支的效率都一样。
记住,这也是一个很重要的技巧。