E - 娜娜梦游仙境系列——莫名其妙的插曲
Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others)
Problem Description
娜 娜因为帮桃花村民们解决了一大难题而受到村民们的尊敬,不过由于娜娜还想继续探索这个神奇的世界,只好恋恋不舍地与村民告别。当娜娜离开村庄的一刻,娜娜 失忆了!她不记得桃花村的一切,她不记得之前吃了很多糖果,她不记得她为了过湖而跳了半天,甚至她连自己的名字都不记得了!娜娜盲目地四处溜达,突然迎面 走来了一个白马王子,他问:“你是Alice吗?”。娜娜心想:“Alice?好熟的名字啊,难道这就是我的名字吗?",便回答:”是的。请问您是?“白 马王子很高兴地说:”我叫Bob,我找你找了一辈子了,没有你,我总是被父王忘记,我们回王宫吧!"于是娜娜就迷迷糊糊地被带到了王宫。
国王:“你就是Alice?怎么士别三日,你变痴呆了啊,你先和我的儿子Bob先玩一玩游戏,我看看你是不是脑子有问题。”娜娜为了证明自己脑子没问题,只好与Bob玩起了游戏。
游戏规则很简单,一开始有一个集合,集合里有n个不同的数,然后Alice(娜娜)与Bob轮流进行操作,每人都可以任意选择两个数a,b,不妨设 a>b,不过要求a-b不在集合中,把a-b放入集合。如果轮到某人,无法进行任何操作,则该人输掉游戏。作为职业博弈选手,娜娜即使失忆了也能凭 着身体的直觉去进行最优操作。那么问,当Alice(娜娜)与Bob都沿着最优策略进行,女士优先(即娜娜先手),最终谁会获胜?
Input
多组数据,首先是一个正整数t(t<=20),表示数据的组数
对于每组数据,首先是一个整数n(1<=n<=1,000),然后是n个整数x[i](0<x[i]<=1,000,000,000),表示集合。保证集合元素不会出现相同。
Output
对于每组数据,若Alice(娜娜)最终胜利,输出"Win"
若Bob最终胜利,输出"Lose"
若无法分出胜负,输出"Draw",(均不包括双引号,注意大小写,建议复制)
Sample Input
2 5 1 2 3 4 5 5 1 2 3 4 6
Sample Output
Lose Win
Hint
样例1,一开始无论娜娜选择哪两个元素,其差值均包括在集合中,故娜娜无法操作,Bob胜利,输出Lose
样例2,一开始娜娜只能选择1和6这两个元素,并把6-1=5放入集合中,则集合变为1,2,3,4,5,6 Bob无法操作,Alice(娜娜)胜利,输出Win
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 #include <string> 7 #include <vector> 8 #include <set> 9 #include <map> 10 #include <stack> 11 #include <queue> 12 #include <sstream> 13 #include <iomanip> 14 using namespace std; 15 typedef long long LL; 16 const int INF = 0x4fffffff; 17 const double EXP = 1e-5; 18 const int MS = 1005; 19 const int SIZE = 10005; 20 21 int num[MS]; 22 int flag[MS]; 23 int n; 24 25 int gcd(int a,int b) 26 { 27 return b==0?a:gcd(b,a%b); 28 } 29 30 int main() 31 { 32 int T; 33 scanf("%d",&T); 34 while(T--) 35 { 36 scanf("%d",&n); 37 for(int i=0;i<n;i++) 38 scanf("%d",&num[i]); 39 int g=num[0]; 40 for(int i=1;i<n;i++) 41 g=gcd(g,num[i]); 42 int maxv=-INF; 43 for(int i=0;i<n;i++) 44 { 45 num[i]/=g; 46 if(num[i]>maxv) 47 maxv=num[i]; 48 } 49 int cnt=0; 50 memset(flag,0,sizeof(flag)); 51 for(int i=0;i<n;i++) 52 if(flag[i]==0) 53 { 54 flag[i]=1; 55 cnt++; 56 } 57 cnt=maxv-cnt; 58 if(cnt&1) 59 printf("Win\n"); 60 else 61 printf("Lose\n"); 62 63 } 64 return 0; 65 }