大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:
现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。
输入格式:
输入第 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 }
转载于:https://www.cnblogs.com/ManOK/p/10185637.html