JOJ 1119 1121

JOJ 1119: Number Game

题目:http://acm.jlu.edu.cn/joj/showproblem.php?pid=1119

题目大意:两个人轮流取数,取数规则如下:已经取过的数不能取;已经取过的数的倍数不能取;不能取的数字的和也不能取。如果轮到某个人取数时,已经无数可取,则输掉游戏。现在给出当前可取的数字的列表,问应该取哪个数才能胜利,如果这样的数不止一个,把它们全部输出出来,如果没有这样的数,则输出一条无解的信息。

给出的是当前可取的数字的列表,一个思路就是把每个数字都取走然后看看会是什么结局,所以就是一个普通的DFS。搜索树的每个结点的状态就是当前游戏局面(即当前可取的数字的列表),游戏的人肯定都会走对自己最有利的那步,所以如果当前局面下存在某个数字,取走它以后剩下的局面必败,则当前就是一个必胜的局面。如果不存在这样的数字,当前局面就是一个必败的局面。当前无数字可取的时也是一个必败的局面。

把搜索树画出来会发现其中有很多重叠的子问题,所以使用动态规划的备忘录方法把已经得到结论的局面保存起来。题目中的数据规模不超过20,所以用一个整数的第i位表示数字i可取。

 

JOJ 1121 False Coin

题目:http://acm.jlu.edu.cn/joj/showproblem.php?pid=1121

大意:N个硬币中有一个硬币不合格,可能轻也可能重,一架天平能称出两堆硬币重量的相对关系。给出K次称量结果,写程序计算出哪个硬币不合格,如果不能确定,输出0.硬币从1开始编号,比如第一次称量是13轻,第二次称量是23轻,则可以肯定3不合格。

解法:要找到一个通用的从不等式推导确定出不合格硬币的方法没有什么思路。所以换个角度,从结果开始往前回潮,题目的结果就是找到了某个硬币是坏的,或者不能确定(这种情况发生在可能有不止一个硬币是坏的)。而这“某一个硬币是坏的”的某一个硬币可能是N个硬币中的任何一个,所以可以想到用穷举来逐个排除。那么一个硬币到底如何被排除?题目说只有一个硬币是坏的,因此可以假设其它硬币的重量此时都是1,而坏硬币的重量可能比1小也可以比1大,令它分别为02,然后验证那些不等式是否成立,如果所有不等式都成立,说明这个硬币是坏的。否则,这个硬币是是合格的。这个过程中,记录坏硬币的个数和编号,穷举完了所有硬币,如果只有一个坏硬币,输出它的编号,多于一个,输出0.

你可能感兴趣的:(Algorithm)