大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:
现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。
输入格式:
输入第 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
分析:
题目很坑,一点都不严谨,也没有表述清楚。
题目中的描述缺少一种情况,就是如果有人一局也没有赢应该输出什么,题目没有说,测试点1 2 4,正好就是这样情况,一直都过不了,很坑。
后来百度有人说,默认是B,如果没有获胜,输出B。
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
typedef long long LL;
typedef pair<char,int> PII;
const int N = 100010;
int n;
int ca[N],cb[N];
int wa[N],wb[N];
char s[3] = {'B','C','J'};
//C 代表“锤子”、J 代表“剪刀”、B 代表“布”
// 胜 1 负 -1 平 0
int main()
{
cin >> n;
for(int i = 1 ;i <= n ;i ++)
{
char a,b;
cin >> a >> b;
if(a == b) ca[i] = 0, cb[i] = 0;
else if(a == 'C')
{
if(b == 'J') wa[a-'0']++,ca[i] = 1,cb[i] = -1;
else wb[b-'0']++,cb[i] = 1,ca[i] = -1;
}
else if(a == 'J')
{
if(b == 'B')wa[a-'0']++,ca[i] = 1,cb[i] = -1;
else wb[b-'0']++,cb[i] = 1,ca[i] = -1;
}
else if(a == 'B')
{
if(b == 'C')wa[a-'0']++,ca[i] = 1,cb[i] = -1;
else wb[b-'0']++,cb[i] = 1,ca[i] = -1;
}
}
int a =0 ,b = 0,c = 0;
for(int i = 1 ; i<= n ;i ++)
{
if(ca[i] == 1)a++;
else if(ca[i] == 0)b++;
else c++;
}
printf("%d %d %d\n",a,b,c);
a =0 ,b =0 ,c =0;
for(int i = 1 ; i<= n ;i ++)
{
if(cb[i] == 1)a++;
else if(cb[i] == 0)b++;
else c++;
}
printf("%d %d %d\n",a,b,c);
int num = 0;
char type = 'B';
for(int i = 0 ;i < 3; i++)
{
if(wa[s[i] - '0'] > num )
{
num = wa[s[i] - '0'];
type = s[i];
}
}
printf("%c ",type);
num = 0; type = 'B';
for(int i = 0 ;i < 3; i++)
{
if(wb[s[i] - '0'] > num )
{
num = wb[s[i] - '0'];
type = s[i];
}
}
printf("%c",type);
return 0;
}