PAT 1018ハンマーはさみ布


みんなはすべて“ハンマーのはさみの布”のゲームを游ぶべきです:2人は同时にジェスチャーを出して、胜负の规则は図のようです:今2人の交戦の记录をあげて、双方の胜ち、引き分け、负の回数を统计して、しかも双方がそれぞれどんなジェスチャーを出す胜算が最も大きいことをあげてください.入力形式は、1行目に正の整数N(<=105)を入力し、双方が交戦した回数である.その後、N行目には、1行ごとに交戦した情報、すなわち甲、乙双方が同時に与えたジェスチャーが与えられる.Cは「ハンマー」、Jは「はさみ」、Bは「布」を表す1文字目は甲、2文字目は乙、真ん中にスペースが1つあります.出力形式出力1、2行目はそれぞれ甲、乙の勝、平、負の回数を与え、数字間は1つのスペースで区切られる.3行目には2つのアルファベットが与えられ、それぞれ甲、乙の優勝回数が最も多いジェスチャーを表し、真ん中に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 
using namespace std;

int change(char c){
      //            
    if(c == 'B') return 0;
    if(c == 'C') return 1;
    if(c == 'J') return 2;
    
    return -1;
}

int main(){
     
    char mp[3] = {
     'B', 'C', 'J'}; //     mp[0 ~ 2]  BCJ                
    
    //countA[0 ~ 2]            countB    
    //victoryA[0 ~ 2]                 victoryB   
    int countA[3] = {
     0}, countB[3] = {
     0}, victoryA[3] = {
     0}, victoryB[3] = {
     0};
    
    int n; //    
    cin >> n;
    char c1, c2; //         
    int k1, k2; //k1            , k2    
    for(int i = 0; i < n; i++){
     
        cin >> c1 >> c2;
        k1 = change(c1); //     
        k2 = change(c2);
        
        /*
                                   ,  
            k1   k2      (k1 + 1) % 3 == k2;
            k1   k2       k1 == k2;
            
            k1   k2
            0  >  1       
            1  >  2       
            2  >  0       
            
                     k1          (k1 + 1) % 3 == k2      (           QAQ)
                       ,   ,      ~
        */
        if((k1 + 1) % 3 == k2){
     
            countA[0]++; //        
            countB[2]++; //        
            victoryA[k1]++; //    k1           
        }
        else if(k1 == k2){
     
            countA[1]++; // 
            countB[1]++;
        }
        else{
     
            countA[2]++; //  
            countB[0]++; //  
            victoryB[k2]++; //    k2           
        }
    }
    
    cout << countA[0] << " " << countA[1] << " " << countA[2] << endl;
    cout << countB[0] << " " << countB[1] << " " << countB[2] << endl;
    
    int max1 = 0, max2 = 0;
    for(int i = 1; i < 3; i++){
      //             (   0~2      ) 
        if(victoryA[i] > victoryA[max1]) max1 = i;
        if(victoryB[i] > victoryB[max2]) max2 = i;
    }
    
    cout << mp[max1] << " " << mp[max2] << endl; 
    //                  mp               BCJ
    return 0;
}