poj 2505 A multiplication game (类似于递推思想和博弈)

版权声明:转载注明下出处就行了。 https://blog.csdn.net/LJD201724114126/article/details/83063936

题目链接:poj 2505

题意:Stan and Ollie 两人玩游戏,Stan先手,一开始 P=1,每次玩家可以在数字 [ 2 , 9 ] 范围内选择一个数与p相乘,当P>=n时,此时的某玩家获胜。

题解:我们可以这样思考,首先我们先设 X,满足 X*9>=P , 即我们可以把这解释为,谁先到达 大于等于X的值,谁就输,为什么呢?假设有一玩家到达了Y值(Y>=X),那么一定存在一个数a(a<=9),使得Y*a>=P,那不就是另一玩家获胜了。

紧接着我们看X,再设 t,满足 t*2>=X,即我们可以把这解释为,谁先到达 大于等于t的值,谁就赢,这里为什么是t*2?而不是t1*9呢?你想下,假设是t1*9>=X,根据谁先到达X,谁就输,那么即是某一玩家1到达了t1,另一玩家2会那么傻,选一个最大的9,然后去满足大于等于X,给玩家1获胜吗?很显然不会,那么玩家二在这时会怎么选了,他肯定选了小于9的i,使得t2*i<X。故t*2是正确的,让某一玩家到达t后,另一玩家不管选什么数字,都会陷于>=X的困境。


#include<cstdio>
#include<algorithm>
#include<cstring>

using namespace std;
typedef long long LL;

int book[20]={0,0,0,1,1,1,1,1,1,1}; ///book[i]=1表示到达i,Sta获胜,反之。
int main()
{
    LL n;

    while(~scanf("%lld",&n))
    {
        int times=0;
        while(n>9) ///小于9的不用去除
        {
            times++;
            if(times%2){ ///奇数时除9,并保证item*9>=n
                    int item;
                item=n/9;
                if(n%9) item++;
                n=item;
            }
            else{ ///偶数是除9
                int item;
                item=n/2;
                if(n%2) item++;
                n=item;
            }
        }

        if(times%2==0){ ///偶数次和第一次都是他获胜
            printf("Stan wins.\n");
        }
        else{ ///奇数次时,n(已除到小于等于9)表示谁先到达n,谁输
            if(book[n]){
                printf("Stan wins.\n");
            }
            else{
                printf("Ollie wins.\n");
            }
        }
    }
    return 0;
}

我的标签:到了关键时刻了!

猜你喜欢

转载自blog.csdn.net/LJD201724114126/article/details/83063936