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";
        }
        
    }
  • 相关阅读:
    Node实践之二
    Node实践之一
    总结的JS数据类型判定(非常全面)
    利用chorme调试手机网页
    设计模式总结综述
    Python3标准库使用样例
    systemd 文档教程
    编写Postgres扩展之五:代码组织和版本控制
    编写Postgres扩展之三:调试
    编写Postgres扩展之四:测试
  • 原文地址:https://www.cnblogs.com/komet/p/12900311.html
Copyright © 2011-2022 走看看