1018 锤子剪刀布 (20 分)
大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:
现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。
输入格式:
输入第 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
思路:这道题目我用三个变量v,e和l分别表示甲方的赢,平局和输。因为是甲方和乙方进行比赛,故对应的是乙方的输,平局和赢,因此
不用额外记录。对于记录双方获胜次数最多的手势,起初采用一个map来解决,即输出甲方获胜次数最多的手势和输出甲方输的次数
最多的手势的对应乙方的手势。提交后没有满分,后来分析发现可能有平局的情况出现,题目中如果没有唯一解,那么输出字典序最小的
手势,所以我又建立的一个map,专门记录乙方获胜次数最多的手势。
注意:这道题目要注意处理解不唯一的情况,(包括如果全为平局时,获胜的次数为零,那么我们应当输出字典序较小的手势)
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int main() 5 { 6 int N; 7 map<char,int> m,n; 8 m['C']=0; 9 m['J']=0; 10 m['B']=0; 11 n=m; 12 cin>>N; 13 char A,B; 14 int max=0; 15 int lastnum1,lastnum2; 16 char lastchar1,lastchar2; 17 lastnum1=lastnum2=0; 18 lastchar1=lastchar2='B'; 19 int v,e,l; 20 v=0;e=0;l=0; 21 for(int i=0;i<N;i++) 22 { 23 cin>>A>>B; 24 if(A==B) 25 e++; 26 else 27 { 28 if((A=='C'&&B=='J')||(A=='J'&&B=='B')||(A=='B'&&B=='C')) 29 { 30 v++;m[A]++; 31 if(m[A]>=lastnum1) 32 { 33 if(m[A]!=lastnum1) 34 { 35 lastnum1=m[A]; 36 lastchar1=A; 37 } 38 else 39 { 40 if(A<lastchar1) 41 lastchar1=A; 42 } 43 } 44 } 45 else if((A=='C'&&B=='B')||(A=='J'&&B=='C')||(A=='B'&&B=='J')) 46 { 47 l++;n[B]++; 48 if(n[B]>=lastnum2) 49 { 50 if(n[B]!=lastnum2) 51 { 52 lastnum2=n[B]; 53 lastchar2=B; 54 } 55 else 56 { 57 if(B<lastchar2) 58 lastchar2=B; 59 } 60 } 61 } 62 } 63 } 64 cout<<v<<" "<<e<<" "<<l<<endl; 65 cout<<l<<" "<<e<<" "<<v<<endl; 66 cout<<lastchar1<<" "<<lastchar2<<endl; 67 return 0; 68 }
解法2:for循环找出获胜次数最多的手势
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int main() 5 { 6 int N; 7 map<char,int> m,n; 8 m['C']=0; 9 m['J']=0; 10 m['B']=0; 11 n=m; 12 cin>>N; 13 char A,B; 14 int max=0; 15 int v,e,l; 16 v=0;e=0;l=0; 17 for(int i=0;i<N;i++) 18 { 19 cin>>A>>B; 20 if(A==B) 21 e++; 22 else 23 { 24 if((A=='C'&&B=='J')||(A=='J'&&B=='B')||(A=='B'&&B=='C')) 25 { 26 v++;m[A]++; 27 } 28 else if((A=='C'&&B=='B')||(A=='J'&&B=='C')||(A=='B'&&B=='J')) 29 { 30 l++;n[B]++; 31 } 32 } 33 } 34 map<char,int>::iterator it,maxit; 35 36 cout<<v<<" "<<e<<" "<<l<<endl; 37 cout<<l<<" "<<e<<" "<<v<<endl; 38 maxit=n.begin(); 39 for(it=m.begin();it!=m.end();it++) 40 { 41 if(it->second>max) 42 { 43 max=it->second; 44 maxit=it; 45 } 46 } 47 cout<<maxit->first; 48 max=0;maxit=n.begin(); 49 for(it=n.begin();it!=n.end();it++) 50 { 51 if(it->second>max) 52 { 53 max=it->second; 54 maxit=it; 55 } 56 } 57 cout<<" "<<maxit->first<<endl; 58 return 0; 59 }