PAT 乙级 1019 数字黑洞 (20point(s))

题目

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

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

输入格式:
输入第 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

思路

这个题的难点在于如何快速想到 第 3 行给出两个字母,分别代表甲、乙获胜次数最多的手势,中间有 1 个空格。如果解不唯一,则输出按字母序最小的解。 这句话的实现方案

给出的代码中,采用了一个长度为 3 的 int 型数组 jiaScore[3] 和 yiScore[3],表示依次 B C J 三者的数量

代码

#include <iostream>

using namespace std;

int main() {
    int N;
    cin >> N;
    int jiaScore[3] = {0};
    int yiScore[3] = {0};
    int jiaWin = 0, jiaLose = 0;
    char jia, yi;
    for (int i = 0; i < N; i++) {
        cin >> jia >> yi;
        if (jia == 'C' && yi == 'J') {
            jiaScore[1]++;
            jiaWin++;
        } else if (jia == 'C' && yi == 'B') {
            yiScore[0]++;
            jiaLose++;
        } else if (jia == 'B' && yi == 'J') {
            yiScore[2]++;
            jiaLose++;
        } else if (jia == 'B' && yi == 'C') {
            jiaScore[0]++;
            jiaWin++;
        } else if (jia == 'J' && yi == 'B') {
            jiaScore[2]++;
            jiaWin++;
        } else if (jia == 'J' && yi == 'C') {
            yiScore[1]++;
            jiaLose++;
        }
    }
    cout << jiaWin << " " << N - jiaWin - jiaLose << " " << jiaLose << endl;
    cout << jiaLose << " " << N - jiaWin - jiaLose << " " << jiaWin << endl;
    int jiaIndex = jiaScore[0] >= jiaScore[1] ? 0 : 1;
    jiaIndex = jiaScore[jiaIndex] >= jiaScore[2] ? jiaIndex : 2;
    int yiIndex = yiScore[0] >= yiScore[1] ? 0 : 1;
    yiIndex = yiScore[yiIndex] >= yiScore[2] ? yiIndex : 2;
    char arr[3] = {'B', 'C', 'J'};
    cout << arr[jiaIndex] << " " << arr[yiIndex];
}
### PAT 乙级 1019 题目解析与 C++ 实现 对于PAT乙级1019题目,即数字黑洞问题,在给定任意四正整数(所有全相同),通过特定变换最终会得到6174的结果。此过程涉及将原数按降序排列形成最大数以及升序排列形成最小数并求差。 #### 完整的C++代码实现如下: ```cpp #include <iostream> #include <algorithm> #include <string> using namespace std; // 函数用于计算一次迭代后的结果 void calculate(string& num) { string asc = num, desc = num; sort(asc.begin(), asc.end()); // 升序排序 sort(desc.rbegin(), desc.rend()); // 降序排序 int diff = stoi(desc) - stoi(asc); cout << desc << " - " << asc << " = " << diff << endl; sprintf((char*)num.data(), "%04d", diff); // 更新num为新的差异值,并保持四长度 } int main() { string n; cin >> n; while (true) { if (n == "6174") break; // 如果已经到达6174,则停止循环 calculate(n); if (stoi(n) == 0) { // 特殊情况处理:如果所有都相等则提前结束 cout << "0000"; break; } if (n == "6174") // 输出最后一次等于6174的情况 cout << "6174 - 4167 = 2073"; } return 0; } ``` 上述代码实现了从用户输入的一个数开始断重复操作直到获得6174的过程[^5]。每次迭代都会打印当前的最大数减去最小数的结果,并更新原始字符串`n`以便下一轮比较。当达到6174时终止程序运行;另外还考虑到了特殊情况——如果初始数值经过转换变为零,则立即退出循环并输出相应提示信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一杯刘

我 风暴降生 打钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值