PAT乙级真题
题目链接:
https://pintia.cn/problem-sets/994805260223102976/problems/994805304020025344
引入:
大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:
现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。
输入格式:
输入第 1 行给出正整数 N(≤105),即双方交锋的次数。随后 N 行,每行给出一次交锋的信息,即甲、乙双方同时给出的的手势。C
代表“锤子”、J
代表“剪刀”、B
代表“布”,第 1 个字母代表甲方,第 2 个代表乙方,中间有 1 个空格。
输出格式:
输出第 1、2 行分别给出甲、乙的胜、平、负次数,数字间以 1 个空格分隔。第 3 行给出两个字母,分别代表甲、乙获胜次数最多的手势,中间有 1 个空格。如果解不唯一,则输出按字母序最小的解。
输入样例:
10
C J
J B
C B
B B
B C
C C
C B
J B
B C
J J
输出样例:
5 3 2
2 3 5
B B
分析:
解题思路
① 写一个函数将出招转换为数字0对应B,1对应C,2对应J,再通过斗兽棋型比大小的常规套路得出谁赢。
套路链接:https://blog.csdn.net/m0_51487301/article/details/119763269
② 用两个整数数组记录甲乙各自获得胜利对应的出招的个数,后续遍历比较大小,用一个整数记录赢最多的出招对应的下标
③ 用字符数组存放出招,输出上面那个整数的下标
#include <iostream>
using namespace std;
int chuzhao(char a){ //写一个函数,将出招转换为数字方便后面操作
if(a == 'B') return 0;
if(a == 'C') return 1;
if(a == 'J') return 2;
}
int main(){
char J, Y;
char zhao[3] = {'B', 'C', 'J'}; //顺序固定,否则赢数相同时无法按照字符顺序输出
int maxj[3] = {0}, maxy[3] = {0};
int Jia, Yi;
int jw = 0 , yw = 0, p = 0; //甲赢乙就输,所以分别用一个数据记录即可
int n;
cin >> n;
for(int i = 0; i < n; i++){
cin >> J >> Y; //甲乙出招
Jia = chuzhao(J);
Yi = chuzhao(Y);
if((Jia + 1) % 3 == Yi) { //甲赢
jw++;
maxj[Jia]++;
}
else if((Yi + 1) % 3 == Jia){ //乙赢
yw++;
maxy[Yi]++;
}
else if(Jia == Yi) //平局
p++;
}
int jm = 0, ym = 0; //记录甲、乙获胜场数最多的出招的下标
for(int i = 1; i < 3; i++){
if(maxj[i] > maxj[jm]) jm = i;
if(maxy[i] > maxy[ym]) ym = i;
}
cout << jw << " " << p << " " << yw << endl;
cout << yw << " " << p << " " << jw << endl;
cout << zhao[jm] << " ";
cout << zhao[ym]; //注意这里没有空格
}
悄咪咪表白柳婼大佬