1 条题解
-
0
题目分析
本题可类比“田忌赛马”问题,通过贪心策略比较两个数组的得分。每个元素代表一匹马的速度,两两比赛,赢者得3分,平者得2分,输者得1分。需计算两种情况下的得分:B数组对A数组的得分,以及A数组对B数组的得分。
核心思路
- 贪心策略:采用双指针法,分别指向两个数组的左右端点,通过比较元素大小决定比赛策略:
- 若B数组的最大元素 > A数组的最大元素,用B的最大赢A的最大,得3分;
- 若B数组的最小元素 > A数组的最小元素,用B的最小赢A的最小,得3分;
- 若B数组的最小元素 == A数组的最大元素,用B的最小与A的最大比,平得2分;
- 否则,用B的最小输A的最大,得1分。
- 两次计算:分别计算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
- 上传者