锤子剪刀布

(一)问题归纳

题目来源: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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值