关闭

poj 2505 A multiplication game(博弈)

676人阅读 评论(0) 收藏 举报

【题目大意】:给出一个数n...两个人轮流游戏,每次可以给p=1乘上2~9之间的任意一个数,问谁先达到n。


【解题思路】:如果n的范围在2~9之间...先手胜,10~18之间后手胜....19~162之间...是由后手必胜态(10~18)转移过来的必败态(因为在10~18的情况下,是我要赢,我势必拿最大)...163~324是由先手必胜态(19~162)转移过来的后手必胜态...以此类推....

可以得到一堆先手必胜态和必败态的区间。~~然后找规律...发现区间的右端点都是*9*2*9*2...这样子得到的...所以只需要/18除完它,看剩下的数是在2~9直接还是>9即刻...


Orz~傻傻的用lld,wa了一次


【代码】:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <cmath>
#include <string>
#include <cctype>
#include <map>
#include <iomanip>
                   
using namespace std;
                   
#define eps 1e-8
#define pi acos(-1.0)
#define inf 1<<30
#define linf 1LL<<60
#define pb push_back
#define lc(x) (x << 1)
#define rc(x) (x << 1 | 1)
#define lowbit(x) (x & (-x))
#define ll long long

double n;

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


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:94400次
    • 积分:2006
    • 等级:
    • 排名:第19190名
    • 原创:115篇
    • 转载:8篇
    • 译文:0篇
    • 评论:3条
    最新评论