题目来源
现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。
输入格式:
输入第 1 行给出正整数 N(≤10
5
),即双方交锋的次数。随后 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
C++实现:
#include <iostream>
#include <vector>
#include <string>
#include <cstdio>
#include <string>
#include <algorithm>
#include <stack>
#include <map>
#include <queue>
#include <unordered_set>
#include <unordered_map>
using namespace std;
int change(char c) {
if (c == ‘B‘) {
return 0;
}
else if (c == ‘C‘) {
return 1;
}
else if (c == ‘J‘) {
return 2;
}
}
int main() {
string mp = "BCJ"; // 布 锤 剪
int N;
cin >> N;
int timesJia[3] = { 0 }; // 甲的胜平负
int timesYi[3] = { 0 }; // 乙的胜平负
int handJia[3] = { 0 }; // 甲3种手势获胜的次数分别为 B C J对应 0 1 2
int handYi[3] = { 0 };
char cJia, cYi;
int p1, p2;
for (int i = 0; i < N; ++i) {
cin >> cJia >> cYi;
p1 = change(cJia);
p2 = change(cYi);
// B > C > J > B
// 0 1 2 1
if (p1 == p2) {
// 平手
timesJia[1]++;
timesYi[1]++;
}
else if ((p1 + 1) % 3 == p2) {
// 甲赢
timesJia[0]++;
timesYi[2]++;
handJia[p1]++; // 甲用p1手势赢的次数加1
}
else {
// 乙赢
timesJia[2]++;
timesYi[0]++;
handYi[p2]++;
}
}
cout << timesJia[0] << ‘ ‘ << timesJia[1] << ‘ ‘ << timesJia[2] << endl;
cout << timesYi[0] << ‘ ‘ << timesYi[1] << ‘ ‘ << timesYi[2] << endl;
int maxJia = 0, maxYi = 0;
for (int i = 0; i < 3; ++i) {
if (handJia[i] > handJia[maxJia]) {
maxJia = i;
}
if (handYi[i] > handYi[maxYi]) {
maxYi = i;
}
}
cout << mp[maxJia] << ‘ ‘ << mp[maxYi];
return 0;
}
Java实现:
// TODO