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;
}
原文地址:https://www.cnblogs.com/fxh0707/p/14339840.html