题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2149;
Public SaleTime Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 11335 Accepted Submission(s): 6708 Problem Description 虽然不想,但是现实总归是现实,Lele始终没有逃过退学的命运,因为他没有拿到奖学金。现在等待他的,就是像FarmJohn一样的农田生涯。
Input 本题目包含多组测试,请处理到文件结束(EOF)。每组测试占一行。
Output 对于每组数据,在一行里按递增的顺序输出Lele第一次可以加的价。两个数据之间用空格隔开。
Sample Input 4 2 3 2 3 5
Sample Output 1 none 3 4 5 题目大意:给你一个成本价为M, 然后两个人按顺序叫价,但每次叫价增加的价格必须在(1~N)之间,最后谁报的的价先超过或等于M,谁就赢。两个人都很聪明,主角先叫价,问他第一次报价为多少时可以赢,如果能赢把他第一次报价的所有能赢的价格都输出来,如果没有赢的可能性就输出none。
解题思路:典型的博弈,如果对博弈一点都不了解,只是单纯找规律,做起来会很恼火。这道题就是巴什博奕,就相当于有M个物品,两个人轮流取,每次只能去(1~n)个。谁能先取完,谁就赢。这里有个公式M=(n+1)r+s,只要第一个人能取走s个,后手无论怎么取,比如k个(k<n)。那么先手只需要去(n+1-k)个。这样下去先手一定是第一个取完M的,这就是先手必胜,反之如果M与n+1取余为0,先手必败。这道题稍微又多了一点变化,n可以大于M,这种情况需要特判一下, 这也是先手必胜的情况只需要输出(M~N)就行了。输出所有能赢的价格就是保证你第一次报价后剩下的价格必须保证是(n+1)的倍数,就ok了,就这一点变化。AC代码:
|
386

被折叠的 条评论
为什么被折叠?



