zoukankan      html  css  js  c++  java
  • [bzoj1115][POI2009]石子游戏Kam_博弈论_阶梯博弈

    石子游戏 Kam bzoj-1115 POI-2009

    题目大意:给定n堆石子,两个人轮流取石子。每堆石子的个数都不少于前一堆石子。每次取后也必须维持这个性质。问谁有必胜策略。

    注释:$1le casesle 10$,$1le nle 1000$。


    想法:我们发现,每一次取石子的个数收到限制。但是取了一堆的石子,后面那堆的石子可以取得个数就会变多。

    所以我们考虑相邻两堆石子做差,就变成了经典的阶梯博弈。

    阶梯博弈的结论:总SG值等于奇数阶梯的SG的异或和。

    最后,附上丑陋的代码... ...

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    inline char nc() {static char *p1,*p2,buf[100000]; return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;}
    int rd() {int x=0; char c=nc(); while(!isdigit(c)) c=nc(); while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=nc(); return x;}
    int a[1010];
    int main()
    {
        int cases=rd(); while(cases--)
        {
            int n=rd(); for(int i=1;i<=n;i++) a[i]=rd();
            int ans=0; for(int i=n;i>0;i-=2) ans^=(a[i]-a[i-1]);
            if(ans) puts("TAK");
            else puts("NIE");
        }
    }
    

    小结:博弈论的题目,就是抓住SG定理和最基本的分析。最重要的还是对一些经典博弈问题的掌握程度。

  • 相关阅读:
    线程间的通信
    高速排序算法
    LightOJ 1205 Palindromic Numbers
    java异常处理
    Android Bundle类
    Linux守护进程的编程实现
    深入浅出JMS(一)——JMS简单介绍
    Maven安装与配置
    matlab学习------------普通dialog对话框,错误对话框errordlg,警告对话框warndlg
    读书笔记:计算机网络4章:网络层
  • 原文地址:https://www.cnblogs.com/ShuraK/p/9661948.html
Copyright © 2011-2022 走看看