【博弈论】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";
    }
    
}
原文地址:https://www.cnblogs.com/komet/p/12900311.html