题目
两人玩锤子剪刀布,现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。
输入格式:
输入第 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
分析
- 求解双方胜、负、平次数,只需每次输入数据时进行判断然后累加即可,注意一人胜另一人负。
- 求解双方胜利次数最多的手势,且如果解不唯一,选择字母序小的。可用数组下标来顺序对应B、C、J来解决。
- 可使用一个结构体来存储,成员包括victory,draw,defeat,count[3]。声明两个结构体变量时,声明为全局变量。这样编译器会将变量初始化,不用再自己另外再初始化。
AC代码
#include<iostream>
using namespace std;
struct node
{int count[3];int victory,draw,defeat;
}A,B;
int game(char A,char B)
{if(A==B)return 0;else if((A=='C'&&B=='J')||(A=='B'&&B=='C')||(A=='J'&&B=='B'))return 1;elsereturn 2;
}int main()
{int i,N;char ch1,ch2; cin>>N;for(i=0;i<N;i++){cin>>ch1>>ch2;int temp=game(ch1,ch2);if(temp==0){A.draw++;B.draw++;}else if(temp==1){A.victory++;B.defeat++; if(ch1=='B')A.count[0]++; else if(ch1=='C')A.count[1]++;elseA.count[2]++;}else{B.victory++;A.defeat++;if(ch2=='B')B.count[0]++; else if(ch2=='C')B.count[1]++;elseB.count[2]++;}}cout<<A.victory<<" "<<A.draw<<" "<<A.defeat<<endl;cout<<B.victory<<" "<<B.draw<<" "<<B.defeat<<endl;int max_A=A.count[0],max_B=B.count[0],flag1=0,flag2=0;for(i=1;i<3;i++){if(A.count[i]>max_A){max_A=A.count[i];flag1=i; }if(B.count[i]>max_B){max_B=B.count[i];flag2=i; } }if(flag1==0) cout<<"B ";else if(flag1==1)cout<<"C ";elsecout<<"J ";if(flag2==0) cout<<"B";else if(flag2==1)cout<<"C";elsecout<<"J";return 0;
}
如果小伙伴有任何问题或者建议,欢迎评论区留言或者私信博主哦
更多题解
pat 乙级 题解汇总(持续更新)(C++)