1018 锤子剪刀布
题目
大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:

现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。
输入格式
输入第 1 行给出正整数 N(≤10^5),即双方交锋的次数。随后 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
解析
A 赢的就是 B 输的,平局是相等的用数组保存胜利次数,数组下标为 手势 - 'A',一个小整数,二维数组分别存储两人某个手势的胜利次数
因为A/B赢的情况是固定的,直接判断是A赢还是B赢,对应手势+1以后进行判断,如果和目前最大的相等则判断这个手势的字典序,大于才替换
如果+1以后大于就直接替换,这样输入若不是平局就对A,B分别判断赢得哪个手势
也蛮冗余的,有空再优化优化😁
答案
#include<iostream>
#include<string>
using namespace std;
int main(){
int N,eq = 0,win = 0,de = 0,A[2][30] = {0};
cin>>N;
char a,b,maxA = 'B',maxB = 'B';
while (N--){
cin>>a>>b;
if(a == b){
eq ++; //平局
continue;
}
else if((a == 'C' && b == 'J') || (a == 'J' && b == 'B') || (a == 'B' && b == 'C')){ //A胜利的3种情况
win ++;
A[0][a - 'A'] ++; //a胜 b败
if(A[0][maxA - 'A'] == A[0][a - 'A']){
if(maxA > a){ //如果和当前最多的手势次数相等,选择字典序小的那个
maxA = a;
}
}else if(A[0][maxA - 'A'] < A[0][a - 'A']){ //如果比当前大就直接换
maxA = a;
}
}else if((b == 'C' && a == 'J') || (b == 'J' && a == 'B') || (b == 'B' && a == 'C')){ //B胜利的3种情况
de ++;
A[1][b - 'A'] ++;
if(A[1][maxB - 'A'] == A[1][b - 'A']){
if(maxB > b){
maxB = b;
}
}else if(A[1][maxB - 'A'] < A[1][b - 'A']){
maxB = b;
}
}
}
cout<<win<<" "<<eq<<" "<<de<<endl;
cout<<de<<" "<<eq<<" "<<win<<endl;
cout<<maxA<<" "<<maxB<<endl;
}

浙公网安备 33010602011771号