hdu3595 博弈

来源:互联网 发布:山东省工程咨询院 知乎 编辑:程序博客网 时间:2024/05/16 10:44

题意:n个游戏同时进行,每个游戏有两堆石子,每次从较多堆里取走较少堆的整数倍的石子数。仍然计算先手有无必胜策略。

解法:比较难想的一道博弈题,参考了爱神的博客题解,看了好久才懂,在此附上地址:http://blog.csdn.net/acm_cxlove/article/details/7840427

自己的代码:

/***************************************************** author:xiefubao*******************************************************/#pragma comment(linker, "/STACK:102400000,102400000")#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#include <queue>#include <vector>#include <algorithm>#include <cmath>#include <map>#include <set>#include <stack>#include <string.h>using namespace std;#define eps 1e-8typedef long long LL;int num[100];int main(){   int t;   while(scanf("%d",&t)!=EOF)    {       int ans=0;      while(t--)       {           int a,b;           scanf("%d%d",&a,&b);           if(a<b) swap(a,b);           num[0]=a;num[1]=b;           int p=1;           while(num[p]){               num[p+1]=num[p-1]%num[p];p++;           }           int j=-1;           int tool=p-1;//cout<<p<<endl;           for(int i=1;i<p;i++)           {               if(num[i-1]/num[i]>1)               {                   if(j>=0&&((i-j)&1))                     tool++;                  j=i;               }           }           ans=max(tool,ans);       }//cout<<ans<<endl;        if(ans&1) cout<<"MM\n";        else cout<<"GG\n";   }   return 0;}

0 1
原创粉丝点击