打扑克平【ACM】
打扑克
时间限制: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[10000]={0};//记录标记。
int main(){
int m,i,count,numa,numb,*a,*b,*d,n,h,x,j;
scanf("%d",&n);
while(n--){
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);// 赢得牌的个数
printf("numa=%d %d ",numa,count);
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);
printf("numb=%d %d ",numb,count);
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];
}
}
printf("%d %d\n",numa,numb);
if(numa>=numb)
printf("Yes\n");
else
printf("No\n");
}
}