pat乙级1018. 锤子剪刀布 (20)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/richenyunqi/article/details/79505405

欢迎访问我的pat乙级题解目录哦https://blog.csdn.net/richenyunqi/article/details/84981369

题目描述

算法设计

可定义一个维度为3的int数组来记录甲的胜平负情况,然后乙的胜平负次数就是甲的负平胜次数。题目中还要求输出获胜最多的手势,如果解不唯一,则输出按字母序最小的解。这一点可以通过定义一个map来解决,map的键存储表示手势的字符,值存储相应手势的胜利次数。注意map会自动根据键的大小进行排序,所以当存储完毕,我们只需在对map遍历的过程中找出胜利次数最大的手势即可,而不需要额外的语句找出字母序最小的手势,这就避免了写繁杂的if-else语句的判断。

C++代码

#include<bits/stdc++.h>
using namespace std;
int cmp(char a,char b){//得出甲乙谁胜谁负,甲胜返回1,乙胜返回-1,平局返回0
    if(a==b)
        return 0;
    else if((a=='B'&&b=='C')||(a=='C'&&b=='J')||(a=='J'&&b=='B'))
        return 1;
    else
        return -1;
}
char maxSheng(map<char,int>&sheng){//获取获胜最多的手势
    char maxChar='B';
    for(auto i=sheng.cbegin();i!=sheng.cend();++i)
        if(i->second>sheng[maxChar])
            maxChar=i->first;
    return maxChar;
}
int main(){
    int N;
    scanf("%d",&N);
    map<char,int>Asheng,Bsheng;//记录甲乙获胜的各手势次数
    int A[3]={0};//记录甲的胜平负次数
    for(int i=0;i<N;++i){
        char a,b;
        scanf("\n%c %c",&a,&b);
        int temp=cmp(a,b);
        if(temp==1){
            ++A[0];
            ++Asheng[a];
        }else if(temp==-1){
            ++A[2];
            ++Bsheng[b];
        }else
            ++A[1];
    }
    for(int i=0;i<3;++i)
        printf("%s%d",i>0?" ":"",A[i]);
    printf("\n");
    for(int i=2;i>=0;--i)
        printf("%s%d",i<2?" ":"",A[i]);
    printf("\n%c %c",maxSheng(Asheng),maxSheng(Bsheng));
    return 0;
}

 

展开阅读全文

没有更多推荐了,返回首页