题目描述
大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。
输入格式
输入第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
个人代码:
//
#include<bits/stdc++.h> using namespace std; int change(char c) { if(c=='B') return 0; if(c=='C') return 1; if(c=='J') return 2; } int main() { int n,k1,k2; char c1,c2; int a[20]={0}; int b[20]={0}; int awin[10]={0}; int bwin[10]={0}; scanf("%d",&n); getchar(); for(int i=1;i<=n;i++) { scanf("%c %c",&c1,&c2); getchar(); k1=change(c1); k2=change(c2); if((k1+1)%3==k2) { a[0]++; b[2]++; awin[k1]++; } if(k1==k2) { a[1]++; b[1]++; } if((k2+1)%3==k1) { b[0]++; a[2]++; bwin[k2]++; } } printf("%d %d %d\n",a[0],a[1],a[2]); printf("%d %d %d\n",b[0],b[1],b[2]); int cwin=0; int dwin=0; int w1,w2; char mp[3]={'B','C','J'}; for(int i=0;i<3;i++) { if(awin[i]>awin[cwin]) { cwin=i; } if(bwin[i]>bwin[dwin]) { dwin=i; } } printf("%c %c",mp[cwin],mp[dwin]); }
分析:
输出要求是要输出甲乙两个人的胜负平局情况,所以先设定两个数组a[20],b[20]存储胜负平情况,a[0]表示胜利,a[1]表示平局,a[2]表示失败,如果甲胜利的话,就是a[0]++b[2]++,如果甲乙平局的话,就是a[1]++,b[1]++;如果乙胜利的话,b[2]++,a[0]++;其中a[0]表示的是胜利,a[1]表示的是平局,a[2]表示的是失败,每读入一组数据,就将数组信息变更,对于找胜率最高的情况,可以设置数组awin[]和bwin[],a[0]表示的是B获胜的情况,a[1]表示的是C获胜的情况,a[2]表示的是J获胜的情况,之后比较三个数组的值就好,为了方便一点,可以另外设置一个数组mp,用来存放B C J,方便输出结果。
注意:
数组有点多,有点乱,需要自己好好琢磨一下。
第一次测试点三没有通过,原因是找最大的情况的时候算法有点错误。已更正。