1. 程式人生 > 其它 >PAT (Basic Level) Practice1018 錘子剪刀布

PAT (Basic Level) Practice1018 錘子剪刀布

1018 錘子剪刀布

一、題目

大家應該都會玩“錘子剪刀布”的遊戲:兩人同時給出手勢,勝負規則如圖所示:
在這裡插入圖片描述
現給出兩人的交鋒記錄,請統計雙方的勝、平、負次數,並且給出雙方分別出什麼手勢的勝算最大。

二、輸入輸出

輸入格式

輸入第 1 行給出正整數 N ( ≤ 1 0 ​ 5 ) (≤10^​5) (105),即雙方交鋒的次數。隨後 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

四、題目分析

簡單的計數問題,讀入迴圈次數,迴圈讀入字元,通過判斷結果計數,最後輸出勝出做多的手勢是可以使用分類排序,首先按照勝利次數降序排序,其次按照字母序升序排序,最後輸出首位字母。

五、程式碼

#include <bits/stdc++.h>
using namespace std;
struct count_max
{
    char ch;
    int count;
} jia[3], yi[3];
bool cmp
(count_max a, count_max b) { if (a.count != b.count) return a.count > b.count; else return a.ch < b.ch; } int main() { jia[0].ch = 'C', jia[1].ch = 'J', jia[2].ch = 'B'; yi[0].ch = 'C', yi[1].ch = 'J', yi[2].ch = 'B'; int n; cin >> n; int jiawin =
0; int yiwin = 0; for (int i = 0; i < n; i++) { char a, b; cin >> a >> b; if (a == 'C') { if (b == 'J') { jiawin++; jia[0].count++; } else if (b == 'B') { yiwin++; yi[2].count++; } } else if (a == 'B') { if (b == 'C') { jiawin++; jia[2].count++; } else if (b == 'J') { yiwin++; yi[1].count++; } } else if (a == 'J') { if (b == 'B') { jiawin++; jia[1].count++; } else if (b == 'C') { yiwin++; yi[0].count++; } } } sort(jia, jia + 3, cmp); sort(yi, yi + 3, cmp); cout << jiawin << ' ' << n - jiawin - yiwin << ' ' << yiwin << '\n'; cout << yiwin << ' ' << n - jiawin - yiwin << ' ' << jiawin << '\n'; cout << jia[0].ch << ' ' << yi[0].ch; return 0; }