解题思路
计算甲乙两者的胜负,相当于零和博弈,甲赢了乙肯定输了,所以记录甲就行了,乙的胜负与之相反。
注意
最后需要输出获胜次数最多的手势,我开始是用数组记录,将获胜的手势字符转变为ASCII对应的数值存在数组中,然后从数组中找出最大值,最后用char输出该结果,但~是~没通过。我觉得逻辑上没问题,后来我实在没办法了,只能搞了个map通过了。
#include<cstdio>
#include<map>
using namespace std;
int check(char a,char b){
if(a==b)
return 0;
else if(a=='J'&&b=='B')
return 1;
else if(a=='B'&&b=='C')
return 1;
else if(a=='C'&&b=='J')
return 1;
else
return -1;
}
int main(){
int n;
char ch1,ch2;
map<char,int> mpA,mpB;
mpA.clear();
mpB.clear();
int win=0,even=0,lose=0;
scanf("%d",&n);
for(int i=0;i<n;i++){
getchar(); //这个地方是为了防止后面接收字符时把上一次的换行也读入进来了
scanf("%c %c",&ch1,&ch2);
if(check(ch1,ch2)==1){
win++;
mpA[ch1]++;
}else if(check(ch1,ch2)==0){
even++;
}else{
lose++;
mpB[ch2]++;
}
}
printf("%d %d %d\n",win,even,lose);
printf("%d %d %d\n",lose,even,win);
map<char,int>::iterator it;
int max=0;
for(it=mpA.begin();it!=mpA.end();it++){
if(it->second > max){
ch1=it->first;
max=it->second;
}
}
max=0;
for(it=mpB.begin();it!=mpB.end();it++){
if(it->second > max){
ch2=it->first;
max=it->second;
}
}
printf("%c %c\n",ch1,ch2);
return 0;
}