大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:
现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。
输入格式:
输入第 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
第二次:(算法笔记题解)
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 using namespace std; 7 bool cmp(int a,int b) 8 { 9 return a>b; 10 } 11 int change(char a) 12 { 13 if(a=='B')return 0; 14 if(a=='C')return 1; 15 if(a=='J')return 2; 16 } 17 int main() 18 { 19 int n; 20 cin>>n; 21 char mp[3]={'B','C','J'}; 22 int a[10009],b[10009]; 23 char s1,s2; 24 int win[3]={0},hand1[3]={0},hand2[3]={0}; 25 for(int i=0;i<n;i++) 26 { 27 cin>>s1>>s2; 28 a[i]=change(s1); 29 b[i]=change(s2); 30 if((a[i]+1)%3==b[i]) 31 { 32 win[0]++; 33 hand1[a[i]]++; 34 } 35 else if(a[i]==b[i]) 36 win[1]++; 37 else 38 { 39 win[2]++; 40 hand2[b[i]]++; 41 } 42 } 43 printf("%d %d %d ",win[0],win[1],win[2]); 44 printf("%d %d %d ",win[2],win[1],win[0]); 45 int i1=0,i2=0; 46 for(int i=0;i<3;i++) 47 { 48 if(hand1[i]>hand1[i1])i1=i; 49 if(hand2[i]>hand2[i2])i2=i; 50 } 51 printf("%c %c",mp[i1],mp[i2]); 52 53 54 }
第一次:(我自己写的自己都看不懂emmm)
1 #include<iostream> 2 #include<cstdio> 3 #include<stdlib.h> 4 #include<cstring> 5 using namespace std; 6 int main() 7 { 8 int n,flag[3]={0},flagm1[3]={0},flagm2[3]={0}; 9 char a[10000],b[10000],m[3]={'J','B','C'}; 10 cin>>n; 11 for(int i=0;i<n;i++) 12 { 13 cin>>a[i]>>b[i]; 14 int x=a[i]-b[i]; 15 if(x==0) 16 flag[1]++; 17 else if(x<0||x==8) 18 { 19 flag[0]++; 20 if(a[i]==m[0]) 21 flagm1[0]++; 22 else if(a[i]==m[1]) 23 flagm1[1]++; 24 else 25 flagm1[2]++; 26 } 27 else 28 { 29 flag[2]++; 30 if(b[i]==m[0]) 31 { 32 flagm2[0]++; 33 } 34 35 else if(b[i]==m[1]) 36 { 37 flagm2[1]++; 38 } 39 else 40 flagm2[2]++; 41 } 42 43 } 44 cout<<flag[0]<<" "<<flag[1]<<" "<<flag[2]<<endl; 45 cout<<flag[2]<<" "<<flag[1]<<" "<<flag[0]<<endl; 46 cout<<flagm1[0]<<" "<<flagm1[1]<<" "<<flagm1[2]<<endl; 47 if(flagm1[0]>flagm1[1]&&flagm1[0]>flagm1[2]) 48 cout<<m[0]<<" "; 49 else if(flagm1[1]>flagm1[0]&&flagm1[1]>flagm1[2]) 50 { 51 cout<<m[1]<<" "; 52 } 53 else 54 cout<<m[2]<<" "; 55 56 if(flagm2[0]>flagm2[1]&&flagm2[0]>flagm2[2]) 57 { 58 cout<<m[0]<<endl; 59 } 60 61 else if(flagm2[1]>flagm2[0]&&flagm2[1]>flagm2[2]) 62 { 63 cout<<m[1]<<endl; 64 } 65 else 66 { 67 cout<<m[2]<<endl; 68 // cout<<flagm2[0]<<" "<<flagm2[1]<<" "<<flagm2[2]<<endl; 69 } 70 71 72 }
网上找的题解:太佩服了,感觉比算法笔记上的还要简单清晰
1 #include <iostream> 2 3 using namespace std; 4 5 int win[3] = {0}; 6 7 char max3(int *a) { 8 9 char r = 'B'; 10 11 if(a[1] > a[0]) { 12 13 a[0] = a[1]; 14 15 r = 'C'; 16 17 } 18 19 if(a[2] > a[0]) r = 'J'; 20 21 return r; 22 23 } 24 25 int main() { 26 27 int n; 28 29 char a[105],b[105]; 30 31 int awin[3] = {0}; 32 33 int bwin[3] = {0}; 34 35 cin >> n; 36 37 for(int i = 0; i < n; i++) { 38 39 cin >> a[i] >> b[i]; 40 41 int k = (a[i] - b[i]) * (a[i] - b[i]); 42 43 if(k == 1) 44 45 a[i] == 66 ? win[0]++,awin[0]++ : (win[1]++,bwin[0]++); 46 47 else if(k == 49) 48 49 a[i] == 67 ? win[0]++,awin[1]++ : (win[1]++,bwin[1]++); 50 51 else if(k == 64) 52 53 a[i] == 74 ? win[0]++,awin[2]++ : (win[1]++,bwin[2]++); 54 55 else 56 57 win[2]++; 58 59 } 60 61 cout << win[0] << " " << win[2] << " " << win[1] << endl; 62 63 cout << win[1] << " " << win[2] << " " << win[0] << endl; 64 65 cout << max3(awin) << " " << max3(bwin); 66 67 return 0; 68 69 }