zoukankan      html  css  js  c++  java
  • CodeForces-1383B GameGame 思维,规律,博弈

    CodeForces-1383B GameGame 思维,规律,博弈

    题意

    给定一个长度为(n) 的数组(a) ,两人轮流取数,取完后移除。

    最终谁的异或和大谁就赢,若是平局则输出"DRAW"

    分析

    比较先入为主的思想就是一定要取最高位,最高位一旦确定为1了后面就不用比了。

    (x) 为当前最高位为(1) 的数的个数,若(x) 为偶数,显然这一位的最终结果是(0) ,接下去比较下一位

    (x) 是奇数,是否就一定先手必胜呢?

    其实未必,有已下结论

    • (x quad mod quad 4 = 3)
      • 若 $y quad mod quad 2 = 0 $ ,后手必胜,先手不管取什么,后手只需要模仿先手的策略,就能最终得到奇数个(1)
      • 若 $y quad mod quad 2 = 1 $ ,先手必胜,先手只需取一个(0) ,就可以把局面转化成上一个局面
    • (x quad mod quad 4 = 1) 先手必胜,先手只需取一个(1) ,由于剩下的(1)(4) 的倍数,先手只需模仿后手的策略即可

    代码

    int a[100005];
    
    int main() {
        int T = readint();
        while (T--) {
            int x = 0;
            int n = readint();
            for (int i = 0; i < n; i++) a[i] = readint(), x ^= a[i];
            if (!x) {
                puts("DRAW");
                continue;
            }
            for(int k = 30;k >= 0;k--)
                if (x >> k & 1) {
                    vector<int> f(2);
                    for (int i = 0; i < n; i++) f[a[i] >> k & 1]++;
                    if (f[1] % 4 == 3 && f[0] % 2 == 0) puts("LOSE");
                    else puts("WIN");
                    break;
                }
        }
    }
    
  • 相关阅读:
    我的第一篇博客
    1.2 位于Shell脚本第一行的#!
    1.1 一个简单的脚本
    JDK与CGlib动态代理的实现
    解决Sublime Text3中文显示乱码问题
    多线程讲解
    (转)Spring中@Async用法总结
    (转)spring boot注解 --@EnableAsync 异步调用
    Spring Boot中的注解
    (转)如何用Maven创建web项目(具体步骤)
  • 原文地址:https://www.cnblogs.com/hznumqf/p/13620114.html
Copyright © 2011-2022 走看看