题目链接: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;
}
我的标签:到了关键时刻了!