PTA(BasicLevel)-1018 錘子剪刀布
阿新 • • 發佈:2020-07-23
一、問題定義
大家應該都會玩“錘子剪刀布”的遊戲:兩人同時給出手勢,勝負規則如下:
剪刀 > 布, 錘子 > 剪刀, 布 > 錘子
現給出兩人的交鋒記錄,請統計雙方的勝、平、負次數,並且給出雙方分別出什麼手勢的勝算最大。
輸入格式:
輸入第 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_cntView Code= 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))
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