/*输入
输入第1行给出正整数N(<=105),即双方交锋的次数。随后N行,每行给出一次交锋的信息,即甲、乙双方同时给出的的手势。C代表“锤子”、J代表“剪刀”、B代表“布”,第1个字母代表甲方,第2个代表乙方,中间有1个空格。
输出
输出第1、2行分别给出甲、乙的胜、平、负次数,数字间以1个空格分隔。第3行给出两个字母,分别代表甲、乙获胜次数最多的手势,中间有1个空格。如果解不唯一,则输出按字母序最小的解。
样例输入
10
C J
J B
C B
B B
B C
C C
C B
J B
B C
J J
样例输出
5 3 2//甲:胜 平 负
2 3 5//乙:胜 平 负
B B//甲胜出最多手势 乙胜出最多手势
*/
#include<iostream>
#define Maxsize 100010
using namespace std;
int contract(char a,char b)
{
if(a=='C'&&b=='J')
return 1;
if(a=='J'&&b=='B')
return 2;
if(a=='B'&&b=='C')
return 3;
if(b=='C'&&a=='J')
return -1;
if(b=='J'&&a=='B')
return -2;
if(b=='B'&&a=='C')
return -3;
if(a==b)
return 0;
}
int max(int c,int j,int b)
{int max=c;
max=c>j?c:j;
max=c>b?c:b;
max=j>c?j:c;
/*
max=j>b?j:b;
max=b>c?b:c;
max=b>j?b:j;*/
return max;
}
int main()
{
int N,i,j,k;
char n_a[Maxsize],n_b[Maxsize];
while(scanf("%d ",&N)!=EOF)
{
if(N>100000||N<=0)
break;
int same,a_c,a_j,a_b,b_c,b_j,b_b,sum_a,sum_b,a_lost,b_lost,pd1,pd2;
same=a_c=a_j=a_b=b_c=b_j=b_b=sum_a=sum_b=a_lost=b_lost=0;
for(i=0;i<N;i++)
{
n_a[i]=getchar();
getchar();
n_b[i]=getchar();
getchar();
}
for(i=0;i<N;i++)
{
k=contract(n_a[i],n_b[i]);
switch(k)
{case 0:{same++;break;}
case 1:{a_c++;break;}//甲出捶win
case 2:{a_j++;break;}//甲出剪刀win
case 3:{a_b++;break;}//甲出布win
case -1:{b_c++;break;}//甲出捶win
case -2:{b_j++;break;}//甲出剪刀win
case -3:{b_b++;break;}//甲出布win
default :break;
}
}
sum_a=a_c+a_j+a_b;//总共A的win
sum_b=b_c+b_j+b_b;//总共B的win
a_lost=N-sum_a-same;
b_lost=N-sum_b-same;
printf("%d %d %d\n",sum_a,same,a_lost);
printf("%d %d %d\n",sum_b,same,b_lost);
pd1=max(a_c,a_j,a_b);
pd2=max(b_c,b_j,b_b);
if(a_b==pd1)
printf("B");
else if(a_c==pd1)
printf("C");
else if(a_j==pd1)
printf("J");
printf(" ");
if(b_b==pd2)
printf("B");
else if(b_c==pd2)
printf("C");
else if(b_j==pd2)
printf("J");
// printf("\n");
printf("\n");
}
return 0;
}
输入犯了错误,因为中间有空格隔开两组数据,用scanf(“%c%c”,&n_a[i],&n_b[i]);但会发现将前10装入A数组中,但却将空格装入B数组中。改为scanf(“%c空格%c”,&n_a[i],&n_b[i]);则会每次字符加空格,不可用。则需通过getchar()接收,而getchar()是以回车结束,空格也会结束,需要一个额外getchar()吸收空格。
最后输出优先输出搞了半天发现想岔了,不用大段判断,只需要和最值比较按照顺序即可。