USACO 2020 年 12 月铜组题目 "Do You Know Your ABCs?"
USACO 2020 年 12 月铜组题目 "Do You Know Your ABCs?" 的 Python 题解。
解题思路
关键观察
给定 7 个数:A, B, C, A+B, B+C, C+A, A+B+C
核心性质:由于 A, B, C 都是正整数且 A ≤ B ≤ C:
A是这 7 个数中最小的A+B+C是这 7 个数中最大的B是这 7 个数中第二小的(因为A+B > B,当A > 0)
证明 B 是第二小的数
比较所有数与 B 的大小:
A ≤ B(已知条件)B = BC ≥ B(已知条件)A+B > B(因为A ≥ 1)A+C ≥ A+B > BB+C > BA+B+C > B
所以 B 仅次于 A,是第二小的数。
算法步骤
- 将 7 个数排序
A = 最小值,B = 第二小值,A+B+C = 最大值C = (A+B+C) - A - B
Python 代码
# 读取输入:七个空格分隔的整数
nums = list(map(int, input().split()))
# 排序
nums.sort()
# A 是最小值
A = nums[0]
# B 是第二小值(严格证明见上方)
B = nums[1]
# A+B+C 是最大值
sum_ABC = nums[-1]
# C = (A+B+C) - A - B
C = sum_ABC - A - B
# 输出结果
print(A, B, C)
验证样例
输入:2 2 11 4 9 7 9
排序后:[2, 2, 4, 7, 9, 9, 11]
A = 2B = 2sum_ABC = 11C = 11 - 2 - 2 = 7
验证 7 个数:
A=2, B=2, C=7A+B=4, B+C=9, C+A=9, A+B+C=11
排序后:2, 2, 4, 7, 9, 9, 11 ✓
输出:2 2 7 ✓
复杂度分析
| 项目 | 复杂度 | 说明 |
|---|---|---|
| 时间 | O(7 log 7) = O(1) | 排序 7 个固定数量的数 |
| 空间 | O(1) | 固定大小数组 |
完整代码(带注释)
# USACO 2020 December Bronze - Do You Know Your ABCs?
# 题解:排序后 A=最小, B=次小, A+B+C=最大, C=最大-A-B
# 读取七个整数
nums = list(map(int, input().split()))
# 排序,使得 nums[0] <= nums[1] <= ... <= nums[6]
nums.sort()
# 关键证明:
# 由于 A,B,C 是正整数且 A<=B<=C
# A 是最小的(显然)
# B 是第二小的:因为 A+B > B(A>0),C>=B,所有其他和都 > B
# A+B+C 是最大的(显然,因为都是正整数)
A = nums[0] # 最小值
B = nums[1] # 第二小值
sum_ABC = nums[6] # 最大值
C = sum_ABC - A - B
print(A, B, C)
为什么不需要验证?
题目保证答案是唯一的,且上述数学推导严格证明了:
A = nums[0]B = nums[1]C = nums[6] - nums[0] - nums[1]
因此直接计算即可,无需额外验证。

浙公网安备 33010602011771号