打扑克
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
2
-
描述
-
最近zmh喜欢上了打扑克,有一天他又找同学打扑克规则如下:2人各有m张牌轮流出牌(打出的牌不归任何人所有), 遇到出的牌和前面有相同,则这之间的排归出牌人,收回牌不打出 ,zmh先出牌,最后拥有牌多者赢(牌数相等也是zmh赢),聪明的zmh知道了两人牌排列的顺序,他想知道自己能不能赢,可他现在有事,你能帮他吗?
-
输入
-
第一行为整数n(n<=200)(n组测试数据)
第二行为整数m(0<=m<=5000),表示二人拥有的牌数,首先给出zmh的牌,有m个整数,第i个整数pi(0<=pi<=10000)表示zmh第i张牌的编号,其次以同样的方式给出zmh的同学的牌
输出
-
如果能赢,输出Yes
不能则输出No
样例输入
-
2 4 1 2 3 4 1 2 3 4 4 4 3 2 1 1 2 3 4
样例输出
-
No Yes
#include<stdio.h> #include<string.h> #include<stdlib.h> int c[1000000];//记录标记。 int main(){ int m,i,count,numa,numb,*a,*b,*d,n,h,x,j; scanf("%d",&n); while(n--){ memset(c,0,sizeof(c)); scanf("%d",&m); a=(int*)malloc(m*sizeof(int)); b=(int*)malloc(m*sizeof(int));// d=(int*)malloc(2*m*sizeof(int));//记录牌的值。 for(i=0;i<m;i++) scanf("%d",&a[i]); for(i=0;i<m;i++) scanf("%d",&b[i]); h=0; count=0; numa=0; numb=0; for(i=0;i<m;i++){ if(c[a[i]]){//如果有相同的 for(j=0;j<h;j++){ if(a[i]==d[j]){ numa+=(count-j+1);// 赢得牌的个数 break; } } count=j; for(x=j;x<h;x++) c[d[x]]=0; h=j; } else{ c[a[i]]=1; d[h++]=a[i]; count++; } if(c[b[i]]){ for(j=0;j<h;j++){ if(b[i]==d[j]){ numb+=(count-j+1); break; } } count=j; for(x=j;x<h;x++) c[d[x]]=0; h=j; } else{ c[b[i]]=1; count++; d[h++]=b[i]; } } if(numa>=numb) printf("Yes\n"); else printf("No\n"); } }
开辟一个数组,用0,1.来记录前边是否出现过这个值。
开辟一个数组,用来记录前边已经出现的每一个数值。
然后记录出现的个数。
-
第一行为整数n(n<=200)(n组测试数据)