1018 锤子剪刀布 (20 分)

大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:

FigCJB.jpg

现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。

输入格式:

输入第 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 } 

 














posted @ 2018-12-27 16:19  focusDing  阅读(1121)  评论(0编辑  收藏  举报