zoukankan      html  css  js  c++  java
  • 【博弈论】Road to Arabella Gym 102263B

    题目:

    题目大意:输入n,k。两个人轮流选一个数x(1<=x<=max(1,n-k))减去n,若到一个人的回合n=0那么那个人失败。Kilani先手。

    通过手动模拟几个实例,很容易发现先手基本都是胜利的。

    如 n取10,k取2;

    先手的取值范围是[1,8],这时x取8一定能获胜,因为当x=8时n=2,后手只能取1,一轮后,先手获胜。

    n取10,k取3;

    先手的取值范围是[1,7],这时x取6一定能获胜,因为当x=6时n=4,后手同样只能取1,此时n又是偶数,几轮下来先手获胜。

    根据实例可以归纳出,只要先手取x使n为偶数并且n-k<=1,就必定获胜。

    加以数学证明:

    设x为先手必胜,所选取的数,所以

    n-x-k<=1  ①

    (n-x)%2=0  

    ①整理得 x>=n-k-1;

    x∈[1,max(1,n-k)];

    当n-k>1时,x∈[1,n-k];

    取最大x=n-k;

    所以 x<=n-k-1 恒成立;

    x-1<=n-k-1 恒成立;

    当n,k是偶数时(n-x)%2=0 成立

    当n,k是奇数时(n-x)%2=0 成立

    当n,k一奇一偶时(n-x-1)%2=0 成立

    所以 当 n-k>1时 先手必胜

    当n-k<=1时,x=1;

    此时若n为偶则后手胜利,反之先手胜利;

    AC代码:

    #include<iostream>
    
    using namespace std;
    
    int main() {
        int t, n, k;
        int flag;
        cin >> t;
        while (t--) {
            flag = 1;
            cin >> n >> k;
            if ((n - k == 1 )||(n-k==0))
                if(n % 2 == 0)flag = 0;
    
            if (flag)cout << "Kilani\n";
            else cout << "Ayoub\n";
        }
        
    }
  • 相关阅读:
    BestCoder Round #65
    Codeforces Round #334 (Div. 2)
    二叉搜索树(排序二叉树)
    二叉搜索树 POJ 2418 Hardwood Species
    差分约束系统 POJ 3169 Layout
    思维题(转换) HDU 4370 0 or 1
    SPFA+Dinic HDOJ 3416 Marriage Match IV
    图论 SRM 674 Div1 VampireTree 250
    SPFA(建图) HDOJ 4725 The Shortest Path in Nya Graph
    SPFA(负环) LightOJ 1074 Extended Traffic
  • 原文地址:https://www.cnblogs.com/komet/p/12900311.html
Copyright © 2011-2022 走看看