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; }
顿悟= =
其实只有一种情况……