题解:
这道题是遇到的第一道相乘的题目,考虑的是谁能先大于等于N。对于这类题目,我觉得不太容易像Nim游戏一样找到一个平衡状态。从必胜态和必败态去考虑,我们转化为一个找每个人必能达到的范围的问题。首先,对于先手来说,2~9为必胜区间,不管先手如何,后手所能达到的最小值是18,所以后手的必胜区间是10~18。之后依次类推,每次在考虑临界值的时候,每个人都是希望自己能更大,而对手是希望更小,两个人分开去考虑,所以按照自己每次乘9,对手乘2来考虑临界区间。
所以有以下结果,符合结论:
1~9 ->Stan;
10~18=2*9->Ollie;
19~162=9*2*9->Stan;
163~324=2*9*2*9->Ollie;
…
代码实现:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define LL long long
using namespace std;
LL N;
LL range;
int main()
{
while( cin>>N ){
range = 1;
int flag = 1;
while( range < N ){
if( flag ){
range *= 9;
flag = 0;
}
else{
range *= 2;
flag = 1;
}
}
if( !flag ){
cout<<"Stan wins."<<endl;
}
else{
cout<<"Ollie wins."<<endl;
}
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-11-09 04:00:40