题目链接:https://pintia.cn/problem-sets/994805260223102976/problems/994805304020025344
分析:题目最后要求按字典序输出最小的解,不妨就将三种手势按字典序排序,B,C,J正好是循环相克,我们分别用0,1,2来代表三种手势,用change函数来转换,那么胜利条件是(k1+1)%3==k2,平 k1=k2。
代码:
#include<iostream>
#include<cstdio>
using namespace std;
#include<algorithm>
#include<cmath>
#include<set>
#include<map>
#include<string>
#include<cstring>
#include<vector>
#include<cstdlib>
#define ll long long int
int change(char c){
if(c=='B') return 0;
if(c=='C') return 1;
if(c=='J') return 2;
}
int main()
{
char flag[3]={'B','C','J'};
int a[3]={0},b[3]={0}; //分别记录两人 胜平负 的次数
int hand_a[3]={0},hand_b[3]={0}; //分别记录两人 各手势 胜的次数,下标与flag对应
int n;
cin>>n;
while(n--){
char k1,k2;
cin>>k1>>k2;
int j=change(k1);
int y=change(k2);
if((j+1)%3==y){
a[0]++;
b[2]++;
hand_a[j]++;
}else if(j==y){
a[1]++;
b[1]++;
}else{
a[2]++;
b[0]++;
hand_b[y]++;
}
}
printf("%d %d %d\n",a[0],a[1],a[2]);
printf("%d %d %d\n",b[0],b[1],b[2]);
int n2=0,m=0;
for(int i=0;i<3;i++){
if(hand_a[i]>hand_a[n2]) n2=i; //分别找两人手势胜的最多的是哪个
if(hand_b[i]>hand_b[m]) m=i;
}
printf("%c %c",flag[n2],flag[m]);
return 0;
}