PAT 乙级 1018.剪子锤子布 C++/Java

题目来源
现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。

输入格式:

输入第 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

PAT 乙级 1018.剪子锤子布 C++/Java

上一篇:HttpServletRequestWrapper 类&过滤指定文字


下一篇:Android系统简介