首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

打扑克平【ACM】解决思路

2013-07-04 
打扑克平【ACM】打扑克时间限制:1000 ms|内存限制:65535 KB难度:2描述最近zmh喜欢上了打扑克,有一天他又找同

打扑克平【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");
}
}

不知道哪里错了。
[解决办法]
每组数据开始前应该初始化一下c吧。。另外你输出Yes/No就是了。。别输出那么多乱七八糟的东西。。

热点排行