首页 > 代码库 > 英雄会题目解析- 第五届在线编程大赛月赛第三题:石子游戏
英雄会题目解析- 第五届在线编程大赛月赛第三题:石子游戏
题目:
甲乙两人面对若干堆石子,其中每一堆石子的数目可以任意确定。两人轮流按下列规则取走一些石子,游戏的规则如下:1.每一步应取走至少一枚石子;2.每一步只能从某一堆中取走部分或全部石子;3.如果谁无法按规则取子,谁就是输家。如果甲乙两人都采取最优的策略,甲先拿,请问,是甲必胜还是乙必胜.输入格式:多组数据,每组数据两行,第一行是一个整数N, 2<=N<=10000下一行是N个正整数,代表每堆的石子数,石子数在32位整数内。输出格式:每组测试数据输出一行,如果甲存在必胜策略,输出"Win",否则输出"Lost"
挑战规则:输入样例33 3 1输出样例:Win
解析:
这题个人感觉应该按照递归的概念来解析。
把若干个组分为1和大于1两种。
如果该组只有一个石子,则标记为1,
如果该组大于一个石子,则标记为1+X。X表示除了1之外所有石子。
比如共有5组石子,2组为1,3组大于1,则表示为5+3X
则可以列出一个如下的表:
解析一下上面的表,
例如2+X,甲先拿,则甲只需要拿一个X,则会变成2,乙先拿。则对应的第四行中,先拿是必输的。
同理,例如第六行中的2X+2,不论甲先拿走一个X,还是一个1+X,剩余的结果2+X、1+X中,都是先拿必赢的,也就代表乙赢。所以,甲是必输的。
然后规律就一目了然了,
只有组数为偶数,并且X的数量是偶数时,则为甲输,否则为甲赢。
代码入下:
public class Shiziyouxi { public static void main(String[] args) { int num=5; int[] nums=new int[]{3,1,23,1,3}; String whoWin = whoWin(nums); System.out.println(whoWin); } public static String whoWin(int[] nums){ int num_all=0; int num_not1=0; for(int i=0;i<nums.length;i++){ num_all++; if(nums[i]!=1){ num_not1++; } } if(num_all%2==0&&num_not1%2==0){ return "Lost"; } return "Win"; } }
上传到网站提交的时候,不知道怎么提交。。
如果有错,希望给予指出。
英雄会题目解析- 第五届在线编程大赛月赛第三题:石子游戏
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。