zoukankan      html  css  js  c++  java
  • ZOJ 3964 Yet Another Game of Stones Nim游戏变种

    ZOJ3964

    解题思路

    此题的题意比较容易理解,可以简单的看着 Nim 博弈的变种。但问题在于 Alice 对第 i 堆石子的取法必须根据 bi 确定。所以如果这个问题能够归结到正常的 Nim 博弈(取石子问题),则很容易解决。

    考虑特判存在 bi=1 或 bi=2 的情况:

    • 如果存在第 i 堆石子,其 ai 为奇数且 bi=2 ,则 Bob 必胜(Alice 在最优策略下无法取完该堆,但 Bob 可以)。
    • 如果存在 2 个及以上 bi=2 或 bi=1  ai>1 的情况,则 Bob 必胜。
    • 如果只有一个 bi=2 (其余都为 bx=0 ) 的情况,则 Alice 为了胜利,必须先将该堆石子取完(否则 Bob 只需取掉该堆 1 个石子, Bob 必胜)。此时问题等同于 n-1 堆石子,Bob 先手的 Nim 博弈。
    • 如果只有一个 bi=1  ai>1 (其余都为 bx=0 )的情况,Alice 同样需先将该堆石子取完(或只剩一个)。此时问题等同于 n-1(n) 堆石子,Bob 先手的 Nim 博弈。

    对于只有 bi=0 的情况,Nim 博弈全部 ai 异或即可。

    经典的Nim游戏 只要连续取异或XOR就可以判断胜负状态。

    #include<bits/stdc++.h>
    using namespace std;
    const int N = 1e5 + 10;
    int a[N], b[N], n;
    bool jug()
    {
        int cnt[3] = {0, 0, 0}, tot = 0;
        for(int i=1;i<=n;i++)
        {
            if(a[i]%2 && b[i] == 2) return false;
            if(b[i] == 2)   cnt[2]++,   cnt[0]++;
            if(a[i] > 1 && b[i] == 1)   cnt[1]++,   cnt[0]++;
        }
        if(cnt[0]>1)    return false;
        if(cnt[1] == 1) {
            for(int i=1;i<=n;i++)
                if(b[i] == 1 && a[i] > 1)   tot ^= (a[i]%2?0:1);
                else    tot ^= a[i];
            return !(tot?1:0);
        }
        else if(cnt[2] == 1) {
            for(int i=1;i<=n;i++)
                if(b[i] != 2)
                    tot ^= a[i];
            return !(tot?1:0);
        }
        else {
            for(int i=1;i<=n;i++)
                tot ^= a[i];
            return tot;
        }
    }
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d",&n);
            for(int i=1;i<=n;i++)
                scanf("%d",&a[i]);
            for(int i=1;i<=n;i++)
                scanf("%d",&b[i]);
            printf("%s
    ", jug() ? "Alice" : "Bob");
        }
    }
    

      

  • 相关阅读:
    数学基础
    Codeforces Beta Round 84 (Div. 2 Only)
    Codeforces Round 256 (Div. 2)
    Codeforces Round FF(Div. 2)
    Codeforces Round 254 (Div. 2)
    Python3 集合(无序的set)
    Python3 字典(map)
    Python3 元组
    Python3 列表
    初等数论及其应用——唯一分解定理
  • 原文地址:https://www.cnblogs.com/heisenberg-/p/6791543.html
Copyright © 2011-2022 走看看