石子游戏 IX-c语言解决

石子游戏 IX

Alice 和 Bob 再次设计了一款新的石子游戏。现有一行 n 个石子,每个石子都有一个关联的数字表示它的价值。给你一个整数数组 stones ,其中 stones[i] 是第 i 个石子的价值。

Alice 和 Bob 轮流进行自己的回合,Alice 先手。每一回合,玩家需要从 stones 中移除任一石子。

如果玩家移除石子后,导致 所有已移除石子 的价值 总和 可以被 3 整除,那么该玩家就 输掉游戏 。
如果不满足上一条,且移除后没有任何剩余的石子,那么 Bob 将会直接获胜(即便是在 Alice 的回合)。

假设两位玩家均采用 最佳 决策。如果 Alice 获胜,返回 true ;如果 Bob 获胜,返回 false 。
这个题目还有我之前做的一个飞机座分配概率让我对编程有了一个新的看法,发现有时候编程需要严谨的数学建模,否则难以解决问题

在这里插入图片描述
对于这一题,我是看着别人题解思路做出来的这里给出题解思路
思路与算法

由于玩家的目标是使得已经被移除的石子的价值总和不是 333 的倍数,因此我们可以把石子分成三类,它们的价值除以 333 的余数分别为 0,1,20, 1, 20,1,2。我们可以直接用 0,1,20, 1, 20,1,2 代表它们的价值,对应的石子数量分别为 cnt0,cnt1,cnt2\textit{cnt}_0, \textit{cnt}_1, \textit{cnt}_2cnt0​,cnt1​,cnt2​。

可以发现,移除类型 000 的石子并不会对总和产生影响,因此类型 000 的石子可以看成是「先后手」交换。具体地,例如当前是 Alice 在进行操作,它发现如果自己选择移除类型 111 或 222 的石子,那么她在最后一定不能获胜。这时它就可以选择移除一个类型 000 的石子,将同样的局面交给 Bob。如果类型 000 的石子还没有移除完,那么 Bob 同样可以通过移除一个类型 000 的石子将局面重新交给 Alice。这样不断地往复下去,我们可以得到结论:

如果类型 000 的石子的个数为偶数,那么胜负情况等价于没有类型 000 的石子的胜负情况;

如果类型 000 的石子个数为奇数,那么胜负情况等价于只有 111 个类型 000 的石子的胜负情况。注意这里不能单纯地等价于「没有类型 000 的石子的胜负情况」的相反情况,这是因为如果所有的石子都被移除完,无论谁移除了最后一个石子,都算 Alice 输。因此如果 Alice 发现自己选择移除类型 111 或 222 的石子不能获胜,于是选择移除类型 000 的石子,并且它不能获胜的原因是「石子会移除完」,那么 Alice 仍然会输。

将类型 000 的石子考虑完全之后,我们就还剩下类型 111 和 222 的石子了。可以发现,为了保证移除石子的和不为 333 的倍数,操作顺序只有可能为下面的两种情况:

如果 Alice 首先移除类型 111 的石子,那么 Bob 只能移除类型 111 的石子,在这之后 Alice 只能移除类型 222 的石子,Bob 同样只能移除类型 111 的石子。以此类推,移除石子的类型序列为:

1121212121⋯1121212121 \cdots 1121212121⋯

如果 Alice 首先移除类型 222 的石子,我们可以类似得到移除石子的类型序列为:

2212121212⋯2212121212 \cdots 2212121212⋯

作为先手的 Alice 可以在二者中选择一个序列。例如 Alice 选择第一种,那么 Bob 永远移除类型 111 的石子,Alice 除了第一步移除类型 111 的石子之外,后续永远移除类型 222 的石子。因此 Alice 可以获胜当且仅当:

类型 111 的石子恰好有 111 个,并且类型 222 的石子至少有 111 个。此时 Alice 在 Bob 完成第一步时获胜;

类型 111 的石子至少有 222 个,并且不能比类型 222 的石子多:

    如果多 111 个,那么在 Alice 移除最后一个类型 222 的石子后,所有的石子都被移除,Bob 获胜;

    如果多 222 个,那么在 Bob 移除最后一个类型 111 的石子后,所有的石子都被移除,Bob 获胜;

    如果多超过 222 个,那么 Alice 会在某一步没有类型 222 的石子可以移除,Bob 获胜;

    如果一样多或类型 222 的石子更多,那么 Bob 会在某一步没有类型 111 的石子可以移除,Alice 获胜。

上面的两个条件可以归纳为同一个条件,即有类型 111 的石子,并且不能比类型 222 的石子多。

同理,如果 Alice 选择第二种,那么她获胜当且仅当有类型 222 的石子,并且不能比类型 111 的石子多。

上述的两种情况也可以归纳为同一种情况,即类型 111 和类型 222 的石子至少都有 111 个。

细节

回到前面关于类型 000 石子的讨论,可以得到 Alice 获胜的条件:

如果类型 000 的石子的个数为偶数,那么 Alice 获胜当且仅当类型 111 和类型 222 的石子至少都有 111 个;

如果类型 000 的石子的个数为奇数,那么 Alice 获胜当且仅当「在没有类型 000 石子的情况下,Bob 获胜且原因不是因为所有石子都被移除」。对应到上面的分析即为「类型 111 的石子比类型 222 多超过 222 个」或者「类型 222 的石子比类型 111 多超过 222 个」。

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/stone-game-ix/solution/shi-zi-you-xi-ix-by-leetcode-solution-kk5f/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

我写的代码如下:

bool stoneGameIX(int* stones, int stonesSize){
    int count1=0,count0=0,count2=0;
    int  i,j;
    for(i=0;i<stonesSize;i++){
        if(stones[i]%3==0){
            count0++;
        }
        if(stones[i]%3==1){
            count1++;
        }
         if(stones[i]%3==2){
            count2++;
        }
    }
    if(stonesSize==1) return false;
    if(count0%2==0&&count1>=1&&count2>=1){
        return true;
       
    }
    if(count0%2!=0){
        if(count1-count2>2)return true;
          if(count2-count1>2)return true;
        

    }
    return false;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值