[语言月赛 202408] 游戏与共同语言 的题解


记住只在没有思路时使用题解,不要从它复制粘贴代码。请尊重题目和题解的作者。
在解题之前提交题解的代码会导致封禁。

作者: admin

概述

本题要求根据胜局数、净胜数、平局记录数三条规则,判断战队 A 与战队 B 谁的排名更靠前,并输出对应字符。核心解法是按照规则的优先级依次比较三个指标,直到分出高下。

分析
核心观察

排名比较可以看作按胜局数、净胜数、平局记录数三个关键字依次比较:前两个关键字大者排名靠前,第三个关键字小者排名靠前;题目保证不会出现三个指标都相同的情况。

思路

依次比较:

  • 若 w_a \ne w_b,胜局数高者排名靠前;
  • 若 w_a = w_b 而 c_a \ne c_b,净胜数高者排名靠前;
  • 若胜局数与净胜数均相同,平局记录数低者排名靠前(此时由题意保证 t_a \ne t_b)。

等价地,可比较三元组 (w, c, -t) 的字典序,字典序大者排名靠前。

具体示例

以样例为例:w_a = w_b = 10,胜局数相同;再比较净胜数,c_a = 5 < c_b = 6,战队 B 净胜数更高,故 B 排名靠前,输出 B。

算法步骤
  1. 读入 A 的三个指标 wa、ca、ta 与 B 的三个指标 wb、cb、tb。
  2. 若 wa 与 wb 不等,胜局数大者胜出。
  3. 否则若 ca 与 cb 不等,净胜数大者胜出。
  4. 否则比较平局记录数,ta 小者胜出。
  5. 输出胜出战队对应的字符 A 或 B。
复杂度分析

时间:O(1)

空间:O(1)

实现注意事项
  • 三个指标最大可达 10^9,C++ 中建议使用 long long 类型存储。
  • 注意第三条规则是平局记录数低者排名靠前,比较方向与前两条相反。
  • 题目保证不存在三项指标完全相同的情况,无需处理并列。
源代码
#include <bits/stdc++.h>
using namespace std;

int main() {
    long long wa, ca, ta, wb, cb, tb;
    cin >> wa >> ca >> ta;
    cin >> wb >> cb >> tb;

    char ans;
    if (wa != wb) {
        ans = wa > wb ? 'A' : 'B';
    } else if (ca != cb) {
        ans = ca > cb ? 'A' : 'B';
    } else {
        ans = ta < tb ? 'A' : 'B';
    }
    cout << ans << '\n';
    return 0;
}
wa, ca, ta = map(int, input().split())
wb, cb, tb = map(int, input().split())

if wa != wb:
    ans = 'A' if wa > wb else 'B'
elif ca != cb:
    ans = 'A' if ca > cb else 'B'
else:
    ans = 'A' if ta < tb else 'B'

print(ans)

评论

目前没有评论。