1. 程式人生 > 實用技巧 >PTA(BasicLevel)-1018 錘子剪刀布

PTA(BasicLevel)-1018 錘子剪刀布

一、問題定義

大家應該都會玩“錘子剪刀布”的遊戲:兩人同時給出手勢,勝負規則如下:

剪刀 > 布, 錘子 > 剪刀, 布 > 錘子

現給出兩人的交鋒記錄,請統計雙方的勝、平、負次數,並且給出雙方分別出什麼手勢的勝算最大。

輸入格式:
輸入第 1 行給出正整數 N(≤),即雙方交鋒的次數。隨後 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

二、解題

python:最後一例超時

# python3
def jCB(a, b):
    if a == b:
        return states[2]
    else:
        return Table[(a, b)]

def sucessGeture(suc):
    max_cnt 
= max(list(suc.values())) max_gess = [key for key in suc.keys() if suc[key] == max_cnt] return sorted(max_gess)[0] def myPrint(array): print("{} {} {}".format(array[0], array[1], array[2])) cnt = input() Alpha = [0, 0, 0] # 甲乙 Beta = [0, 0, 0] # count the succeed hand Suc_Alpha = {ges:0 for ges in
["J", "C", "B"]} Suc_Beta = {ges:0 for ges in ["J", "C", "B"]} states = [(1, -1), (-1, 1), (0, 0)] # >, <, = Table = { ("C", "J"):states[0], ("C", "B"):states[1], ("J", "C"):states[1], ("B", "C"):states[0], ("B", "J"):states[1], ("J", "B"):states[0]} for j in range(int(cnt)): Gestures = input() A, B = Gestures[0], Gestures[2] # 1 0 -1 Ans_a, Ans_b = jCB(A, B)[0], jCB(A, B)[1] # succeed if Ans_a == 1: Alpha[0] += 1 Beta[2] += 1 Suc_Alpha[A] += 1 # count success gesture elif Ans_b == 1: Beta[0] += 1 Alpha[2] += 1 # failed Suc_Beta[B] += 1 # equal elif Ans_a == 0: Alpha[1] += 1 Beta[1] += 1 myPrint(Alpha) myPrint(Beta) print(sucessGeture(Suc_Alpha), sucessGeture(Suc_Beta))
View Code

c++

#include <iostream>
using namespace std;

int count(char *JCB, char hand_chr)
{
    int length = 3;
    for ( int i = 0; i < length; i++) {
        if (JCB[i] == hand_chr) {
            return i;
        }
    }
}

int findMax(int *suc)
{   // linear search 
    int max = suc[0];    
    for (int i = 1; i < 3; i++) {
        if (max < suc[i]) {
            max = suc[i];    
        }
    }
    return max;
}

char findMinChr(char *max_chrs, int max_cnt)
{   // find min_chr in max_chrs
    if (max_cnt == 0) {
        return 'B';
    } else {
        char min_chr = max_chrs[0];
        for (int i = 1; i < max_cnt    ; i++) {
            if (min_chr > max_chrs[i]) {
                min_chr = max_chrs[i];    
            }
        }    
        return min_chr;        
    }
}

int main(int argc, char *argv[])
{
    int N, max_A, max_B, max_cnt= 0;
    char max_chrs[3];
    char max_chr_A, max_chr_B = ' ';
    
    int cnt_A[3] = {0, 0, 0};
    int cnt_B[3] = {0, 0, 0};
    int suc_A[3] = {0, 0, 0};
    int suc_B[3] = {0, 0, 0};
    
    char JCB[3] = {'J', 'C', 'B'};
    char A, B = ' ';
     cin >> N;   //cout << N << "\n";
    
    // C J B
    for (int i = 0; i < N; i++) {
         cin >> A >> B;   //cout << A << " " << B << "\n";    
        if (A == B) {
            cnt_A[1] += 1;
            cnt_B[1] += 1;                
        } else if ((A == 'C' && B == 'J') ||
                   (A == 'J' && B == 'B') ||
                    (A == 'B' && B == 'C')) {
            cnt_A[0] += 1;
            cnt_B[2] += 1;    
            suc_A[count(JCB, A)] += 1; // succeed count
                
        } else if ((A == 'C' && B == 'B') || 
                   (A == 'J' && B == 'C') ||
                    (A == 'B' && B == 'J')) {
            cnt_A[2] += 1;
            cnt_B[0] += 1;    
            suc_B[count(JCB, B)] += 1;                    
        } 
    }
    
    cout << cnt_A[0] << " " << cnt_A[1] << " " << cnt_A[2] << "\n";
    cout << cnt_B[0] << " " << cnt_B[1] << " " << cnt_B[2] << "\n";
    
    max_A = findMax(suc_A);
    max_B = findMax(suc_B);        
    // 有重複程式碼    
    for (int i, j = 0; i < 3; i++) {
        if (suc_A[i] == max_A) {
            max_chrs[j] = JCB[i];
            j++;
            max_cnt++;
        }
    }
    max_chr_A = findMinChr(max_chrs, max_cnt);

    max_cnt = 0;
    for (int i, j = 0; i < 3; i++) {
        if (suc_B[i] == max_B) {
            max_chrs[j] = JCB[i];
            j++;
            max_cnt++;
        }
    }
    max_chr_B = findMinChr(max_chrs, max_cnt);    
    
    cout << max_chr_A << " " << max_chr_B;
    return 0;
}
View Code