GDUFS1146 Banana Game 博弈问题

Problem Address:http://cstfs.gdufs.edu.cn:8080/PKU/showproblem?problem_id=1146

 

周六下午开始进行训练。还是从一点到五点。但是去的人都不太准时。

 

我刚上去精神也不太集中,好久都没出题。

 

后来LJ过来了,我从前门看到他。后来他出了一道题后我才来状态。

 

不过有道DP题本来可以做出来,不过当时没想到用DP。还有一道水题我们都错过了……

 

最后我出了四道题,LJ出了七道,还有一个08的师兄出了一道题,其他人都没有出题……

 

训练完LJ从前门进来,无奈得说不出话……

 

回宿舍后晚上跟LJ讨论了J题,我的方法跟他的不太一样。后来我用我的方法做出来。当然他在比赛的时候就做出来了。

 

然后迅速A掉了A题DP题和I题水题。

 

 

 

这道题是训练时的B题,后来讨论的时候说到了奇异博弈。昨天回宿舍查出了个网址。今天早上看了一下。

 

博弈问题:http://blog.csdn.net/Human_CK/archive/2011/03/27/6281123.aspx

 

发现还是有一点点区别的。

 

思路就是根据堆数分为n=1,n=2和n>=3三种情况。

 

主要是n>=3时就要用到奇异博弈。把每个数都进行异或运算。如果结果为零则说明这是一个奇异局势。

 

跟这道题的不同之处就是本来是没有限制所取最大数值的。

 

以下贴代码:

 

#include <iostream> using namespace std; int main() { int n,m,temp,i,x,a,b; while(scanf("%d %d", &n, &m)!=EOF) { if (n==1) { scanf("%d", &temp); if (temp%(1+m)==0) printf("Lose/n"); else printf("Win/n"); } else if (n==2) { scanf("%d %d", &a, &b); if (a>b) temp=a-b; else temp=b-a; if (temp%(1+m)==0) printf("Lose/n"); else printf("Win/n"); } else { scanf("%d", &temp); for (i=1; i<n; i++) { scanf("%d", &x); temp = temp^(x%(1+m)); } if (temp==0) printf("Lose/n"); else printf("Win/n"); } } return 0; }

 

昨晚分了一下工。FSY看图论和几何,CX看数据结构和搜索,我看数学和DP。

 

还有就是,昨天FSY和CX一道题都没有出……

 

我问FSY为什么没出,他说一直纠结于A题和E题。

 

然后我给CX发过去我们的分工,他一直没回……我过去他宿舍……结果马上切换掉游戏画面……

 

也许注定悲剧……

 

***********************************************************************时间分隔线

 

下午收到师兄发过来的解题代码。

 

#include <stdio.h> int a[1000010]; int main() { int n,m,t; int i; while (scanf("%d%d", &n, &m) != EOF) { for (i = 1;i <= n;i++) { scanf("%d", &a[i]); a[i] = a[i] % (m + 1); } t = a[1]; for (i = 2;i <= n;i++) t = t ^ a[i]; if (t) printf("Win/n"); else printf("Lose/n"); } return 0; }

 

顿悟= =

 

其实只有一种情况……

 

你可能感兴趣的:(GDUFS1146 Banana Game 博弈问题)