1. 程式人生 > >PAT 乙級 1018.錘子剪刀布

PAT 乙級 1018.錘子剪刀布

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

這裡寫圖片描述

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

輸入格式:

輸入第1行給出正整數N(<=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

解題思路

只要輸入的時候邊統計一下當前這一局是誰贏了,記錄贏的那個人出的是什麼,我的程式碼中統計的是a贏的次數,很容易可以知道,a贏就是b輸,反之亦然,最後比較一下兩個人贏的時候分別出的那種手勢最多然後輸出即可,但注意的是若相同的時候要按字典序小的輸出。

程式碼

#include <cstdio>
int main(){
    int
n,s=0,f=0,p=0,ac=0,aj=0,ab=0,bc=0,bj=0,bb=0; char a[2],b[2]; scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%s%s",a,b); if((a[0]=='C'&&b[0]=='J')||(a[0]=='J'&&b[0]=='B')||(a[0]=='B'&&b[0]=='C')){ //a勝利的情況 s++; if(a[0]=='C')ac++; if
(a[0]=='B')ab++; if(a[0]=='J')aj++; } else if((a[0]=='C'&&b[0]=='C')||(a[0]=='J'&&b[0]=='J')||(a[0]=='B'&&b[0]=='B')){ //平局 p++; }else { //a輸了 f++; if(b[0]=='C')bc++; if(b[0]=='B')bb++; if(b[0]=='J')bj++; } } printf("%d %d %d\n%d %d %d\n",s,p,f,f,p,s); printf("%c %c",((ac>ab&&ac>=aj)?'C':(ab>=aj?'B':'J')),(bc>bb&&bc>=bj)?'C':(bb>=bj?'B':'J')); return 0; }