hdu 1517 K(2~9)倍博弈

来源:互联网 发布:程序员培训夜校 编辑:程序博客网 时间:2024/06/11 21:22

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

以前做过不过不认真,现在又忘了。

出处:http://qianmacao.blog.163.com/blog/static/203397180201223174133470/

博弈问题
题意:两人玩游戏,从1开始,轮流对数进行累乘,直到超过一个指定的数。
算法分析:

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

②、如果输入是1018(9*2),因为Ollie是后手,不管第一次Stan乘的是多少,Stan肯定在29之间,如果Stan乘以2,那么Ollie就乘以9,那么Ollie乘以大于1的数都能超过1018中的任何一个数,Ollie必胜。

③、如果输入的是19162(9*2*9),那么这个范围Stan必胜。

④、如果输入是163324(2*9*2*9),这个是Ollie的必胜范围。

…………

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

如果“我方”首先给出了一个在N不断除18后的得到不足18的数M,“我方”就可以胜利,然而双方都很聪明,所以这样胜负就决定与N了,如果N不断除18后的得到不足18的数M,如果1<M<=9则先手胜利,即Stan wins.如果9<M<=18则后手胜利。

 

View Code
// I'm lanjiangzhou//C#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#include <math.h>#include <time.h>//C++#include <iostream>#include <algorithm>#include <cstdio>#include <cstdlib>#include <cmath>#include <cstring>#include <cctype>#include <stack>#include <string>#include <list>#include <queue>#include <map>#include <vector>#include <deque>#include <set>using namespace std;//*************************OUTPUT*************************#ifdef WIN32#define INT64 "%I64d"#define UINT64 "%I64u"#else#define INT64 "%lld"#define UINT64 "%llu"#endif//**************************CONSTANT***********************#define INF 0x3f3f3f3f// aply for the memory of the stack//#pragma comment (linker, "/STACK:1024000000,1024000000")//endint main(){    double n;    while(scanf("%lf",&n)!=EOF){        while(n>18){            n=n/18;        }        if(n<=9) printf("Stan wins.\n");        else printf("Ollie wins.\n");    }    return 0;}

 

 

 

原创粉丝点击