题目
两人玩锤子剪刀布,现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。
输入格式:
输入第 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;
else
return 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]++;
else
A.count[2]++;
}
else
{
B.victory++;
A.defeat++;
if(ch2=='B')
B.count[0]++;
else if(ch2=='C')
B.count[1]++;
else
B.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 ";
else
cout<<"J ";
if(flag2==0)
cout<<"B";
else if(flag2==1)
cout<<"C";
else
cout<<"J";
return 0;
}
如果小伙伴有任何问题或者建议,欢迎评论区留言或者私信博主哦