NOIP-2009-提高-题解

来源:互联网 发布:sql server添加约束 编辑:程序博客网 时间:2024/05/26 09:55

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  算法二

学长说,有时候如果没有什么有用的优化了,可以尝试换一个顺序进行优化,果然对了,倒着搜。以为这样,你当前点选的少,以后的点自然只是这样的几个分支,分支不会很多,每个分支的效率都一样。

记住,这也是一个很重要的技巧。

1 0