zoukankan      html  css  js  c++  java
  • 51Nod 博弈模板题

    连刷3道博弈模板题,算是稍微学习了以下三个经典博弈了。推荐一个博客

    第一道模板:Bash博弈——同余理论

    基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
    有一堆石子共有N个。A B两个人轮流拿,A先拿。每次最少拿1颗,最多拿K颗,拿到最后1颗石子的人获胜。假设A B都非常聪明,拿石子的过程中不会出现失误。给出N和K,问最后谁能赢得比赛。
    例如N = 3,K = 2。无论A如何拿,B都可以拿到最后1颗石子。
    Input
    第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 10000)
    第2 - T + 1行:每行2个数N,K。中间用空格分隔。(1 <= N,K <= 10^9)
    Output
    共T行,如果A获胜输出A,如果B获胜输出B。
    Input示例
    4
    3 2
    4 2
    7 3
    8 3
    Output示例
    B
    A
    A
    B
    //Asimple
    #include <bits/stdc++.h>
    //#define INF 0x3fffffff
    #define swap(a,b,t) t = a, a = b, b = t
    #define CLS(a, v) memset(a, v, sizeof(a))
    #define debug(a)  cout << #a << " = "  << a <<endl
    #define test() cout<<"=========="<<endl
    using namespace std;
    typedef long long ll;
    const int maxn = 50000+5;
    const double PI=acos(-1.0);
    //const ll mod = 1000005;
    const int INF = ( 1 << 20 ) ;
    const int dx[] = {-1, 0, 1, 0};  
    const int dy[] = { 0,-1, 0, 1}; 
    ll n, m, res, ans, len, T, k, num, sum;
    ll mod;
    
    void input() {
        ios_base::sync_with_stdio(false);
        cin >> T;
        while( T -- ) {
            cin >> n >> m;
            if( n%(m+1)!=0 ) cout << "A" << endl;
            else cout << "B" << endl; 
        }
    }
    
    int main(){
        input();
        return 0;
    }

    第二道:Nim游戏——异或理论

    基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
    有N堆石子。A B两个人轮流拿,A先拿。每次只能从一堆中取若干个,可将一堆全取走,但不可不取,拿到最后1颗石子的人获胜。假设A B都非常聪明,拿石子的过程中不会出现失误。给出N及每堆石子的数量,问最后谁能赢得比赛。
    例如:3堆石子,每堆1颗。A拿1颗,B拿1颗,此时还剩1堆,所以A可以拿到最后1颗石子。
     
    Input
    第1行:一个数N,表示有N堆石子。(1 <= N <= 1000)
    第2 - N + 1行:N堆石子的数量。(1 <= A[i] <= 10^9)
    Output
    如果A获胜输出A,如果B获胜输出B。
    Input示例
    3
    1
    1
    1
    Output示例
    A
    //Asimple
    #include <bits/stdc++.h>
    //#define INF 0x3fffffff
    #define swap(a,b,t) t = a, a = b, b = t
    #define CLS(a, v) memset(a, v, sizeof(a))
    #define debug(a)  cout << #a << " = "  << a <<endl
    #define test() cout<<"=========="<<endl
    using namespace std;
    typedef long long ll;
    const int maxn = 1000+5;
    const double PI=acos(-1.0);
    const ll mod = 1000005;
    const int INF = ( 1 << 20 ) ;
    const int dx[] = {-1, 0, 1, 0};  
    const int dy[] = { 0,-1, 0, 1}; 
    ll n, m, res, ans, len, T, k, num, sum;
    //ll mod;
    
    void input() {
        ios_base::sync_with_stdio(false);
        while( cin >> n ) {
            ans = 0;
            for(int i=0; i<n; i++) {
                cin >> num;
                ans ^= num;
            }
            if( !ans ) cout << "B" << endl;
            else cout << "A" << endl;
        }
    }
    
    int main(){
        input();
        return 0;
    }

    第三道:威佐夫游戏——黄金分割

    基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
    有2堆石子。A B两个人轮流拿,A先拿。每次可以从一堆中取任意个或从2堆中取相同数量的石子,但不可不取。拿到最后1颗石子的人获胜。假设A B都非常聪明,拿石子的过程中不会出现失误。给出2堆石子的数量,问最后谁能赢得比赛。
    例如:2堆石子分别为3颗和5颗。那么不论A怎样拿,B都有对应的方法拿到最后1颗。
     
    Input
    第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 10000)
    第2 - T + 1行:每行2个数分别是2堆石子的数量,中间用空格分隔。(1 <= N <= 2000000)
    Output
    共T行,如果A获胜输出A,如果B获胜输出B。
    Input示例
    3
    3 5
    3 4
    1 9
    Output示例
    B
    A
    A
    //Asimple
    #include <bits/stdc++.h>
    //#define INF 0x3fffffff
    #define swap(a,b,t) t = a, a = b, b = t
    #define CLS(a, v) memset(a, v, sizeof(a))
    #define debug(a)  cout << #a << " = "  << a <<endl
    #define test() cout<<"=========="<<endl
    using namespace std;
    typedef long long ll;
    const int maxn = 50000+5;
    const double PI=acos(-1.0);
    const ll mod = 1000005;
    const int INF = ( 1 << 20 ) ;
    const int dx[] = {-1, 0, 1, 0};  
    const int dy[] = { 0,-1, 0, 1}; 
    ll n, m, res, ans, len, T, k, num, sum, t;
    ll a[maxn];
    //ll mod;
    
    void input() {
        ios_base::sync_with_stdio(false);
        cin >> T;
        while( T -- ){
            cin >> n >> m;
            if( n>m ) {
                t = n; n = m; m = t;
            }
            t = floor((m-n)*(1+sqrt(5.0))/2);
            if( t == n ) cout << "B" << endl;
            else cout << "A" << endl;
        }
    }
    
    int main(){
        input();
        return 0;
    }
  • 相关阅读:
    MT【305】丹德林双球
    MT【304】反射路径长度比
    MT【303】估计
    MT【302】利用值域宽度求范围
    MT【301】值域宽度
    MT【300】余弦的三倍角公式
    MT【299】对数型数列不等式
    MT【298】双参数非齐次
    xadmin 自定义actions
    xadmin 添加自定义权限
  • 原文地址:https://www.cnblogs.com/Asimple/p/7637715.html
Copyright © 2011-2022 走看看