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;
    
}
posted @ 2020-08-04 23:36  小马小马最可爱  阅读(210)  评论(0)    收藏  举报