(一)问题归纳
题目来源:https://www.nowcoder.com/pat/6/problem/4044 转载自牛客网
在读懂题目之后,我们可以提出一下问题:
1、如何记录每场比赛结果?
2、题中给出要输出甲乙两名选手胜场中使用频率最高的手势,如果手势数相等,取手势数最小的那个作为结果。
(二)问题解析
1、比赛结果分为胜、负、平。可以用一个结构体记录
typedef struct{
int sheng;
int ping;
int fu;
}result;
2、至于每次选手的最高胜率手势,用计数器计算出胜场时出过的手势
f1->‘C’,f2->‘J’,f3->‘B’,比较f1、f2、f3的大小便可,关于最大数可能相等的特殊情况,则在相等情况下取字母最小的值。
result1=f3>=(f1>=f2?f1:f2)?3:(f1>=f2?1:2);
注意这里将f3放前面,因为f3代表的是B,其字母值最小。接着是f1代表的是C,尽量将小的字母值往前放。
至于乙选手的比赛记录,将甲选手的记录反着输出即可,乙的最高胜率手势即是甲选手的最高败率手势,通过比较甲选手负场出过的手势,同样用计数器记录,将甲负场出过的次数最多的手势记录,乙的最高胜率手势即是其对立手势。
result2=k1>=(k2>=k3?k2:k3)?1:(k2>=k3?2:3);
(三)问题源码
#include <iostream>
using namespace std;
typedef struct{
int sheng;
int ping;
int fu;
}result;
int main()
{
int n,f1=0,f2=0,f3=0,k1=0,k2=0,k3=0,result1,result2;
char jia,yi;
result r={0,0,0};
cin>>n;
for(int i=0;i<n;i++)
{
cin>>jia>>yi;
if(jia=='C')
{
if(yi=='C') r.ping++;
else if(yi=='J') r.sheng++,f1++;
else r.fu++,k1++;
}
else if(jia=='J')
{
if(yi=='C') r.fu++,k2++;
else if(yi=='J') r.ping++;
else r.sheng++,f2++;
}
else
{
if(yi=='C') r.sheng++,f3++;
else if(yi=='J') r.fu++,k3++;
else r.ping++;
}
}
result1=f3>=(f1>=f2?f1:f2)?3:(f1>=f2?1:2);
result2=k1>=(k2>=k3?k2:k3)?1:(k2>=k3?2:3);
cout<<r.sheng<<" "<<r.ping<<" "<<r.fu<<endl;
cout<<r.fu<<" "<<r.ping<<" "<<r.sheng<<endl;
switch(result1)
{
case 1:cout<<'C';break;
case 2:cout<<'J';break;
case 3:cout<<'B';break;
}
cout<<" ";
switch(result2)
{
case 1:cout<<'B';break;
case 2:cout<<'C';break;
case 3:cout<<'J';break;
}
return 0;
}