Skip to content

1018 锤子剪刀布

Statement

Metadata

  • 作者: CHEN, Yue
  • 单位: 浙江大学
  • 代码长度限制: 16 KB
  • 时间限制: 200 ms
  • 内存限制: 64 MB

大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:

FigCJB.jpg

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

输入格式

输入第 1 行给出正整数 N\le 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

Solution

#include <bits/stdc++.h>
using namespace std;
int main() {
    int n, i, j, win = 0, def = 0, ave = 0, max[2][3] = {0}, flag1, flag2, max1 = -1, max2 = -1;
    char a, b;
    string s = "BCJ";
    cin >> n;
    for (i = 0; i < n; i++) {
        scanf(" %c %c", &a, &b);
        if ((a == 'C' && b == 'J') || (a == 'J' && b == 'B') || (a == 'B' && b == 'C')) {
            win++;
            for (j = 0; j < 3; j++)
                if (a == s[j])
                    max[0][j]++;
        } else if (a == b)
            ave++;
        else {
            def++;
            for (j = 0; j < 3; j++)
                if (b == s[j])
                    max[1][j]++;
        }
    }
    printf("%d %d %d\n", win, ave, def);
    printf("%d %d %d\n", def, ave, win);
    for (i = 0; i < 3; i++) {
        if (max[0][i] > max1) {
            max1 = max[0][i];
            flag1 = i;
        }
        if (max[1][i] > max2) {
            max2 = max[1][i];
            flag2 = i;
        }
    }
    cout << s[flag1] << " " << s[flag2] << endl;
}

Last update: May 4, 2022
Back to top