POJ_2505 A multiplication game(博弈,range)

来源:互联网 发布:手机看图纸软件 编辑:程序博客网 时间:2024/06/05 15:31

题目请点我
题解:
这道题是遇到的第一道相乘的题目,考虑的是谁能先大于等于N。对于这类题目,我觉得不太容易像Nim游戏一样找到一个平衡状态。从必胜态和必败态去考虑,我们转化为一个找每个人必能达到的范围的问题。首先,对于先手来说,2~9为必胜区间,不管先手如何,后手所能达到的最小值是18,所以后手的必胜区间是10~18。之后依次类推,每次在考虑临界值的时候,每个人都是希望自己能更大,而对手是希望更小,两个人分开去考虑,所以按照自己每次乘9,对手乘2来考虑临界区间。
所以有以下结果,符合结论:
1~9 ->Stan;
10~18=2*9->Ollie;
19~162=9*2*9->Stan;
163~324=2*9*2*9->Ollie;

代码实现:

#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#define LL long longusing namespace std;LL N;LL range;int main(){    while( cin>>N ){        range = 1;        int flag = 1;        while( range < N ){            if( flag ){                range *= 9;                flag = 0;            }            else{                range *= 2;                flag = 1;            }        }        if( !flag ){            cout<<"Stan wins."<<endl;        }        else{            cout<<"Ollie wins."<<endl;        }    }    return 0;}
0 0