• 1018 锤子剪刀布 (20分)


    模拟题,注意答案要求字典序最小。

    甲赢的时候同时要记乙负,乙赢的时候同时要记甲负,这是成对出现的。

    map<char,int> mpa,mpb;
    int res[2][3];
    int n;
    
    int main()
    {
        cin>>n;
    
        for(int i=0;i<n;i++)
        {
            char a,b;
            cin>>a>>b;
            if(a != b)
            {
                if(a == 'C')
                {
                    if(b == 'J') res[0][0]++,res[1][2]++,mpa['C']++;
                    if(b == 'B') res[1][0]++,res[0][2]++,mpb['B']++;
                }
                else if(a == 'J')
                {
                    if(b == 'B') res[0][0]++,res[1][2]++,mpa['J']++;
                    if(b == 'C') res[1][0]++,res[0][2]++,mpb['C']++;
                }
                else //a == 'B'
                {
                    if(b == 'C') res[0][0]++,res[1][2]++,mpa['B']++;
                    if(b == 'J') res[1][0]++,res[0][2]++,mpb['J']++;
                }
            }
            else res[0][1]++,res[1][1]++;
        }
    
        for(int i=0;i<2;i++,cout<<endl)
            for(int j=0;j<3;j++)
            {
                if(j) cout<<' '<<res[i][j];
                else cout<<res[i][j];
            }
    
        char maxapos='B';
        for(map<char,int>::iterator it=mpa.begin();it!=mpa.end();it++)
            if(it->second > mpa[maxapos])
                maxapos=it->first;
    
        char maxbpos='B';
        for(map<char,int>::iterator it=mpb.begin();it!=mpb.end();it++)
            if(it->second > mpb[maxbpos])
                maxbpos=it->first;
    
        cout<<maxapos<<' '<<maxbpos<<endl;
        //system("pause");
        return 0;
    }
    
    1. 考虑到最后需要输出字典序最小的解,不妨将三种手势先按字典序排序,即B、C、J。可以发现,这个顺序又恰好是循环相克顺序,即B胜C、C胜J、J胜B,因此不妨将B、C、J对应位0、1、2,作为一维数组mp的三个元素:mp[0]='B'、mp[1]='C'、mp[2]='J',同时写一个函数get(char c)来将手势对应到数字。
    2. 对每组读入的甲乙手势c1和c2,先将其通过get函数转换为数字k1和k2,然后判断该局输赢。由于设置的顺序恰好就是循环相克顺序,因此k1胜k2的条件是(k1+1)%3k2,而k1平k2的条件是k1k2,k1输k2的条件是(k2+1)%3==k1。在得到该局输贏后,对甲、乙的胜、平、负次数进行操作,并对赢得该局的一方的手势次数加1。
    3. 比较得到胜利次数最多的手势,输出需要的信息。
    const int N=110;
    int times[2][3];
    int wins[2][3];
    char mp[]={'B','C','J'};
    int n;
    
    int get(char c)
    {
        if(c == 'B') return 0;
        if(c == 'C') return 1;
        if(c == 'J') return 2;
    }
    
    int main()
    {
        cin>>n;
    
        for(int i=0;i<n;i++)
        {
            char a,b;
            cin>>a>>b;
            int ka=get(a),kb=get(b);
            if((ka+1) % 3 == kb) //甲赢
            {
                times[0][0]++;
                times[1][2]++;
                wins[0][ka]++;
            }
            else if(ka == kb)
            {
                times[0][1]++;
                times[1][1]++;
            }
            else
            {
                times[0][2]++;
                times[1][0]++;
                wins[1][kb]++;
            }
        }
    
        cout<<times[0][0]<<' '<<times[0][1]<<' '<<times[0][2]<<endl;
        cout<<times[1][0]<<' '<<times[1][1]<<' '<<times[1][2]<<endl;
    
        int ida=0,idb=0;
        for(int i=0;i<3;i++)
        {
            if(wins[0][i] > wins[0][ida]) ida=i;
            if(wins[1][i] > wins[1][idb]) idb=i;
        }
        cout<<mp[ida]<<' '<<mp[idb]<<endl;
        //system("pause");
        return 0;
    }
    
  • 相关阅读:
    利用ApplicationListener和ContextRefreshedEvent加载自己的beanPool
    java对象转变为map
    Java通过poi创建Excel文件并分页追加数据
    Java通过poi读取excel中文件
    SpringMvc通过controller上传文件代码示例
    SpringCloud组件学习-图
    Java-线程间通信小结
    Java-关于Thread
    Java-对象及变量的并发访问小结
    java爬取免费HTTP代理 code-for-fun
  • 原文地址:https://www.cnblogs.com/fxh0707/p/14339840.html
Copyright © 2020-2023  润新知