1 条题解

  • 0
    @ 2025-10-8 16:54:31

    题目分析

    本题可类比“田忌赛马”问题,通过贪心策略比较两个数组的得分。每个元素代表一匹马的速度,两两比赛,赢者得3分,平者得2分,输者得1分。需计算两种情况下的得分:B数组对A数组的得分,以及A数组对B数组的得分。

    核心思路

    1. 贪心策略:采用双指针法,分别指向两个数组的左右端点,通过比较元素大小决定比赛策略:
      • 若B数组的最大元素 > A数组的最大元素,用B的最大赢A的最大,得3分;
      • 若B数组的最小元素 > A数组的最小元素,用B的最小赢A的最小,得3分;
      • 若B数组的最小元素 == A数组的最大元素,用B的最小与A的最大比,平得2分;
      • 否则,用B的最小输A的最大,得1分。
    2. 两次计算:分别计算B对A和A对B的得分,利用总得分(4n,每场比赛总得分1+3=4或2+2=4)推导A对B的得分(4n - B对A的得分)。

    代码实现

    #include <bits/stdc++.h>
    using namespace std;
    int a[1100], b[1100];
    int n;
    
    // 计算B数组对A数组的最高得分
    int solve(int A[], int B[]) {
        int s = 0;
        int l1 = 1, l2 = 1, r1 = n, r2 = n; // 双指针:A左、A右、B左、B右
        while (l1 <= r1 && l2 <= r2) {
            if (B[r2] > A[r1]) { // B最大 > A最大,用B最大赢A最大
                r1--; r2--; s += 3;
            } else if (B[l2] > A[l1]) { // B最小 > A最小,用B最小赢A最小
                l1++; l2++; s += 3;
            } else if (B[l2] == A[r1]) { // B最小 == A最大,平,得2分
                l2++; r1--; s += 2;
            } else { // B最小 < A最大,输,得1分
                l2++; r1--; s += 1;
            }
        }
        return s;
    }
    
    int main() {
        while (scanf("%d", &n) != EOF) {
            if (n == 0) break;
            for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
            for (int i = 1; i <= n; i++) scanf("%d", &b[i]);
            sort(a + 1, a + n + 1); // 排序A数组
            sort(b + 1, b + n + 1); // 排序B数组
            int ans1 = solve(a, b); // B对A的得分
            int ans2 = solve(b, a); // A对B的得分(此时B为A,A为B)
            printf("%d %d\n", ans1, 4 * n - ans2); // 输出B对A得分和A对B得分
        }
        return 0;
    }
    
    • 1

    信息

    ID
    848
    时间
    1000ms
    内存
    128MiB
    难度
    2
    标签
    递交数
    49
    已通过
    30
    上传者