zoukankan      html  css  js  c++  java
  • P1288 取数游戏II

    luogu原题

    最近刚学了博弈论,拿来练练手qwq

    其实和数值的大小并没有关系

    我们用N/P态来表示必胜/必败状态

    先在草稿纸上探究硬币♦在最左侧(其实左右侧是等价的)的一条长链的N/P态,设链长为n

    我们用1代替其他所有非0数

    n=2: ♦1  N态

    n=3: ♦11 P态

    ......

    我们发现,当n为奇数时,则为P态,反之为N态。

    于是我们就找到了硬币在最左侧时的答案。

    但是,实际上硬币并不一定在最左侧

    此时我们只需要分别判断硬币左边的链和硬币右边的链,只要有一种为N态,则Alice赢,反之Bob赢(双方都会选择最优走法)。

    代码如下:

    #include<iostream>
    #include<cstdio>
    using namespace std;
    int a[43],n,l=1,r=1; //记得要算上硬币所在的点
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;++i) scanf("%d",&a[i]),a[n+i]=a[i];
        for(int i=n;a[i];--i) ++l; //左侧判断
        for(int i=n+1;a[i];++i) ++r; //右侧判断
        if((l&1)&&(r&1)) printf("NO"); //任何一个为奇数则Alice赢
        else printf("YES");
        return 0;
    }
  • 相关阅读:
    kvm克隆虚拟机
    vSAN添加license
    KVM虚拟机快照
    第二次作业及总结——数据类型和运算符
    第二次作业心得
    做完c语言作业的心得
    介绍自己
    awk数组 Jazz
    Java入门第一阶段总结
    区间dp入门+例题
  • 原文地址:https://www.cnblogs.com/kafuuchino/p/9502475.html
Copyright © 2011-2022 走看看