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;
}
- 考虑到最后需要输出字典序最小的解,不妨将三种手势先按字典序排序,即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)来将手势对应到数字。
- 对每组读入的甲乙手势c1和c2,先将其通过get函数转换为数字k1和k2,然后判断该局输赢。由于设置的顺序恰好就是循环相克顺序,因此k1胜k2的条件是(k1+1)%3k2,而k1平k2的条件是k1k2,k1输k2的条件是(k2+1)%3==k1。在得到该局输贏后,对甲、乙的胜、平、负次数进行操作,并对赢得该局的一方的手势次数加1。
- 比较得到胜利次数最多的手势,输出需要的信息。
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;
}