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;
                }
        }
    }
    
  • 相关阅读:
    C#随笔
    C# 程序间通信的各种途径及解析
    C#控件根据窗体改变大小
    c# SqlHelper Class
    初始Java
    函数基础
    基本数据类型的高级特性:
    python基础
    C#double转化成字符串 保留小数位数, 不以科学计数法的形式出现。
    Oracle使用dblink导入数据
  • 原文地址:https://www.cnblogs.com/hznumqf/p/13620114.html
Copyright © 2011-2022 走看看