您的位置:首页 > 其它

HDOJ1517[K(2~9)倍博弈][有规律存在]

2013-07-12 11:27 295 查看
题目:链接

题目:

[align=left]Problem Description[/align]
Stan and Ollie play the game of multiplication by multiplying an integer p by one of the numbers 2 to 9. Stan always starts with p = 1, does his multiplication, then Ollie multiplies the number, then Stan
and so on. Before a game starts, they draw an integer 1 < n < 4294967295 and the winner is who first reaches p >= n
[align=left]Input[/align]
Each line of input contains one integer number n.
[align=left]Output[/align]
For each line of input output one line either

Stan wins. or Ollie wins.

assuming that both of them play perfectly.
[align=left]Sample Input[/align]

162
17
34012226

[align=left]Sample Output[/align]

Stan wins.
Ollie wins.
Stan wins.题目意思是说:两个人乘数,给出的数从1开始,两个人乘的时候可以给原数乘以2到9之间的任何数,现在给出一个数n,判断在两者都采取最优策略的情况下,谁先能够使得乘完之后的数大于等于,谁就胜利。。。。
解题思路:
如果输入是 2 ~ 9 ,因为Stan 是先手,所以Stan 必胜
如果输入是 10~18 ,因为Ollie 是后手,不管第一次Stan 乘的是什么,Stan肯定在 2 ~ 9 之间,
如果Stan乘以 2 ,那么Ollie就乘以 9 ,就到18了,如果Stan乘以 9 ,
那么Ollie乘以大于1的数都都能超过 10 ~ 18 中的任何一个数。Ollie 必胜
如果输入是 19 ~ 162,那么这个范围是 Stan 的必胜态
如果输入是 163 ~ 324 ,这是又是Ollie的必胜态
............
必胜态是对称的!!!
双方都很聪明,所以这样胜负就决定于N了,如果N不断除
18后的得到不足18的数M,如果1<M<=9则先手胜利,即Stan wins.如果9<M<=18
则后手胜利.
这样就直接对N进行除18,得到进行判断即可...上代码:
 
#include <iostream>
#include <cstdio>
#include <string>
#include <string.h>
#include <map>
#include <vector>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <cmath>
#include <queue>
#include <set>
#include <stack>
using namespace std;
int min(int a, int b)
{
if(a<=b)
return a;
return b;
}
int max(int a, int b)
{
if(a>=b)
return a;
return b;
}
double min(double a, double b)
{
if(a<=b)
return a;
return b;
}
double max(double a, double b)
{
if(a>=b)
return a;
return b;
}

int main()
{
double n;
while(scanf("%lf", &n) != EOF)
{
while(n>18)
n /= 18;
if(n <= 9)
printf("Stan wins.\n");
else
printf("Ollie wins.\n");
}
return 0;
}

努力努力...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  博弈 k倍博弈 规律