本文主要是介绍poj2505(典型博弈),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题意: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是在必败还是必胜
其中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;
}
这篇关于poj2505(典型博弈)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!