• Being a Good Boy in Spring Festival 博弈论 Nim博弈


    kiki's game

    Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 40000/10000 K (Java/Others)
    Total Submission(s): 11452    Accepted Submission(s): 6944


    Problem Description
    Recently kiki has nothing to do. While she is bored, an idea appears in his mind, she just playes the checkerboard game.The size of the chesserboard is n*m.First of all, a coin is placed in the top right corner(1,m). Each time one people can move the coin into the left, the underneath or the left-underneath blank space.The person who can't make a move will lose the game. kiki plays it with ZZ.The game always starts with kiki. If both play perfectly, who will win the game?
     

    Input
    Input contains multiple test cases. Each line contains two integer n, m (0<n,m<=2000). The input is terminated when n=0 and m=0.

     

    Output
    If kiki wins the game printf "Wonderful!", else "What a pity!".
     

    Sample Input
    5 3 5 4 6 6 0 0
     

    Sample Output
    What a pity! Wonderful! Wonderful!
     

    Author
    月野兔
     

    Source
     

    Recommend
    威士忌   |   We have carefully selected several similar problems for you:  1846 1847 1848 1849 1517 

    已知Nim博弈的必败态条件是:所有集合的异或是0.

    这个题目要求有多少种操作,就是有有多少种方式可以由当前状态转移到一个必败态

    首先求出异或和,判断当前状态

    如果是必胜态,那么尝试着从其中一个集合取数,让这个集合和其他集合的异或和为0.

    其他集合的异或和 可用 sum^a[i]来求出 sum^a[i]就等价于a[]中除了a[i]的异或和,因为异或是可逆的操作

    然后判断当前的a[i]如果大于sum^a[i],就可以操作这个数字,ans++

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<sstream>
    #include<algorithm>
    #include<queue>
    #include<deque>
    #include<iomanip>
    #include<vector>
    #include<cmath>
    #include<map>
    #include<stack>
    #include<set>
    #include<functional>
    #include<fstream>
    #include<memory>
    #include<list>
    #include<string>
    using namespace std;
    typedef long long LL;
    typedef unsigned long long ULL;
    
    #define N 100
    #define MAXN 20000 + 9
    #define INF 1000000009
    #define eps 0.00000001
    #define sf(a) scanf("%d",&a)
    
    int n;
    int a[N];
    int main()
    {
        while (sf(n), n)
        {
            int sum = 0;
            for (int i = 0; i < n; i++)
                sf(a[i]), sum ^= a[i];
            if (sum == 0)
                cout << 0 << endl;
            else
            {
                int ans = 0;
                for (int i = 0; i < n; i++)
                {
                    if ((sum^a[i]) < a[i])
                        ans++;
                }
                cout << ans << endl;
            }
        }
    }
  • 相关阅读:
    哨兵模式(工作中使用)
    JVM调优-考虑方向
    Spring Cloud Gateway+Nacos出现服务乱串的问题记录
    golang笔记-cache组件应用: freecache/groupcache/golang-lru
    C++优化笔记: -O2/-O3/-ffast-math/SIMD
    linux笔记-查看L1/L2/L3 cache大小
    Dom4j 如何输出 Document 中的内容到文本
    是应该是用 Log 还是 Logger 来定义 Log
    IntelliJ IDEA 如何针对Java 代码快速打印 println
    如何用 Java 判断一个给定的数是不是素数
  • 原文地址:https://www.cnblogs.com/joeylee97/p/7497445.html
Copyright © 2020-2023  润新知