博弈论之Nim游戏


题意:给定nn堆石子,两位玩家轮流操作,每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),最后无法进行操作的人视为失败。
问如果两人都采用最优策略,先手是否必胜。

必胜状态,先手进行某一个操作,留给后手是一个必败状态时,对于先手来说是一个必胜状态。即先手可以走到某一个必败状态。
必败状态,先手无论如何操作,留给后手都是一个必胜状态时,对于先手来说是一个必败状态。即先手走不到任何一个必败状态。
我们要做到先手必胜,我们将数量最多的那一堆取走一部分使得它跟其中一堆相平,这样对手怎么拿,我们就镜像地去拿,这样对手的结果是必然什么都拿不了。
假设三堆石子是1,2,3,第三堆石子无论是拿走一个还是两个,最终结果的三个石子堆,总会有一堆的数量成单数,如1,2,1或者1,2,2或者,1,2,0
但是如果石子是3,4,我们让数量为4的取走1个,这样就是3,3,无论对手取多少,我们镜像地取,对手总会没有东西可取,这样就是我们的必胜状态
要运用到异或,只要有石子对数是偶数对,异或结果就是0,就是必败,反之,必胜。异或可以看这里传送门
code

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1e5 + 10;

int a[N];

int main()
{
    int n,m;
    cin >> n;
    int res = 0;
    for (int i = 0; i < n; i ++)
    {
        cin >> m;
        res ^= m;
    }
    if (!res) cout << "No" << endl;
    else cout << "Yes" << endl;
    return 0;
}
posted @ 2021-10-25 19:31  Gsding  阅读(90)  评论(0)    收藏  举报