首页 > 代码库 > 英雄会题目解析- 第五届在线编程大赛月赛第三题:石子游戏

英雄会题目解析- 第五届在线编程大赛月赛第三题:石子游戏

题目:

甲乙两人面对若干堆石子,其中每一堆石子的数目可以任意确定。两人轮流按下列规则取走一些石子,游戏的规则如下: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";
    }
    
}


上传到网站提交的时候,不知道怎么提交。。

如果有错,希望给予指出。


英雄会题目解析- 第五届在线编程大赛月赛第三题:石子游戏