题意:n = 1,输入一个k,每一次n可以乘以[2,9]中的任何一个数字,两个玩家轮流操作,谁先使得n >= k就胜出
这道题目感觉还不错,自己做了好久都没做出来,然后看了解题才理解的。
解题思路:能进入必败态的状态时必胜态,只能到达胜态的状态为必败态,当n >= K是必败态,[ceil(k/9.0),k-1]是必胜态,
[ceil(ceil(k/9.0)/2.0),ceil(k/9.0)-1]是必败态,这样必胜态和必败态交替,最后就能得到1是在必败还是必胜
这道题目感觉还不错,自己做了好久都没做出来,然后看了解题才理解的。
解题思路:能进入必败态的状态时必胜态,只能到达胜态的状态为必败态,当n >= K是必败态,[ceil(k/9.0),k-1]是必胜态,
[ceil(ceil(k/9.0)/2.0),ceil(k/9.0)-1]是必败态,这样必胜态和必败态交替,最后就能得到1是在必败还是必胜
其中ceil()是向上取整函数
#include<iostream>
#include<algorithm>
#include<cstring>
#include<stack>
#include<queue>
#include<set>
#include<map>
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<time.h>
#include<math.h>
#define inf 0x7ffffff
#define eps 1e-9
#define pi acos(-1.0)
#define P system("pause")
using namespace std;
int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
long long k;
while(scanf("%lld",&k) != EOF)
{
long long a,b,flag;
a = ceil(k/9.0);
b = k-1;
flag = 1;
while(1)
{
// cout<<a<<" "<<b<<endl;
if(1 >= a && 1 <= b)
{
if(flag) printf("Stan wins.\n");
else printf("Ollie wins.\n");
break;
}
if(flag)
{
b = a-1; a = ceil(a/2.0);
flag = 0;
}
else {
int t = b;
b = a - 1; a = ceil(a/9.0);
flag = 1;
}
}
}
return 0;
}