码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 1517 (类巴什博奕) A Multiplication Game

时间:2015-04-10 17:35:52      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:

如果n在[2, 9]区间,那么Stan胜。

如果n在[10, 18]区间,那么Ollie胜,因为不管第一次Stan乘上多少,第二次Ollie乘上一个9,必然会得到一个不小于18的数。

如果n在[19, 162]这个区间呢?

比如说n=19,那么Stan乘上个2,不管Ollie怎么乘,Ollie得到的数必然在[4, 18]这个区间里面,而这里的任意一个数乘上9的话,必然会得到一个不小于19的数,Stan胜。

再比如n=162,Stan最开始乘上一个9,就将Ollie乘完以后的数限制在[18, 81]这个区间里边,而这里的任何一个数乘上9,必然会得到一个不小于162的数,Stan胜。

所以[19, 162]是Stan的必胜区间。

为了更方便理解,再举两个例子:

n=163的时候,不管第一步Stan乘的是多少,Ollie总可以将第二次得到的数限制在[10, 18]这个范围内,那么Stan乘完以后的数在[20, 162]这个范围,最后Ollie乘上个9就赢了。

n=324的时候,Ollie总可以将第二次得到的数限制在[18, 35],这样Stan操作完得到的数就在[36, 315],最后Ollie乘上个9就赢了。

 

说了这么多就是说,我们每次要想办法限制对手下一次操作以后的区间,使得区间左边界不能太小,否则下一步自己就不能到达终止状态;右边界也不能太大,否则对手会到达终止状态。

总结一下规律就是[2, 9]是先手必胜,[10, 18]后手必胜,[19, 162]先手必胜,[163, 324]后手必胜。

技术分享
 1 #include <cstdio>
 2 
 3 int main()
 4 {
 5     double n;
 6     while(scanf("%lf", &n) == 1)
 7     {
 8         while(n > 18) n /= 18;
 9         printf("%s\n", n > 9 ? "Ollie wins." : "Stan wins.");
10     }
11 
12     return 0;
13 }
代码君

 

HDU 1517 (类巴什博奕) A Multiplication Game

标签:

原文地址:http://www.cnblogs.com/AOQNRMGYXLMV/p/4415036.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!