时间限制 1000 ms
内存限制 32768 KB
代码长度限制 100 KB
题目描述
大家应该都会玩“锤子剪刀布”的游戏: 现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。
输入描述:
输入第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>
using namespace std;
static int getMax3(int a, int b, int c)
{
if (a > b)
{
return (a > c) ? a : c;
}
else
{
return (b > c) ? b : c;
}
}
static bool isAwinB(char A, char B)
{
if(A == 'C' && B == 'J'
|| A == 'J' && B == 'B'
|| A == 'B' && B == 'C')
return true;
return false;
}
int main(void)
{
int N;
cin>>N;
char A, B;
int cntA = 0, cntAB = 0, cntB = 0;
int winA[3] = {0}; // B C J
int winB[3] = {0}; // B C J
for (int i = 0; i < N; ++i)
{
cin>>A>>B;
if (A == B)
{
cntAB++;
}
else if(isAwinB(A, B))
{
cntA++;
if (A == 'B')
{
winA[0]++;
}
else if (A == 'C')
{
winA[1]++;
}
else //if (A == 'J')
{
winA[2]++;
}
}
else
{
cntB++;
if (B == 'B')
{
winB[0]++;
}
else if (B == 'C')
{
winB[1]++;
}
else //if (B == 'J')
{
winB[2]++;
}
}
}
cout<<cntA<<" "<<cntAB<<" "<<cntB<<endl;
cout<<cntB<<" "<<cntAB<<" "<<cntA<<endl;
int maxAcnt = getMax3(winA[0], winA[1], winA[2]);
int maxBcnt = getMax3(winB[0], winB[1], winB[2]);
if (maxAcnt == winA[0])
{
cout<<'B'<<" ";
}
else if (maxAcnt == winA[1])
{
cout<<'C'<<" ";
}
else
{
cout<<'J'<<" ";
}
if (maxBcnt == winB[0])
{
cout<<'B'<<endl;
}
else if (maxBcnt == winB[1])
{
cout<<'C'<<endl;
}
else
{
cout<<'J'<<endl;
}
return 0;
}