您的位置:首页 > 其它

hdoj 1517 A Multiplication Game(博弈问题(关键在寻找必胜点))

2014-11-22 20:33 288 查看

A Multiplication Game

http://acm.hdu.edu.cn/showproblem.php?pid=1517


Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 3846    Accepted Submission(s): 2187


[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.

 

[align=left]Source[/align]
University of Waterloo Local Contest 2001.09.22

 

[align=left]Recommend[/align]
LL   |   We have carefully selected several similar problems for you:  1404 1079 1536 1850 1524 

①、如果输入是2~9,因为Stan是先手,所以Stan必胜。

②、如果输入是10~18(9*2),因为Ollie是后手,不管第一次Stan乘的是多少,Stan肯定在2~9之间,所以Ollie必胜。

③、如果输入的是19~162(9*2*9),因为Stan是先手最大取9,再次Olie 取最多也是9 ,剩余小于9的一个数,刚好Stan必胜 

④、如果输入是163~324(2*9*2*9),同理,这个是Ollie的必胜范围。

…………

可以发现必胜态是对称的。

因此我们只需判断将一个数不断除以18(9*2)之后小于或等于9,那么此时Stan刚好可以到达必胜点,否则就是Olie必胜



#include<cstdio>

#include<cstring>

#include<cstdlib>

#include<algorithm>

int main()

{

 double n;

 while(~scanf("%lf",&n))

 {

  while(n>18)

   n/=18;

   if(n<=9)


     printf("Stan
wins.\n");

     else

      printf("Ollie
wins.\n");

 }

 return 0;

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 杭电 acm