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 = B
  • C ≥ B(已知条件)
  • A+B > B(因为 A ≥ 1
  • A+C ≥ A+B > B
  • B+C > B
  • A+B+C > B

所以 B 仅次于 A,是第二小的数。

算法步骤

  1. 将 7 个数排序
  2. A = 最小值B = 第二小值A+B+C = 最大值
  3. 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 = 2
  • B = 2
  • sum_ABC = 11
  • C = 11 - 2 - 2 = 7

验证 7 个数:

  • A=2, B=2, C=7
  • A+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]

因此直接计算即可,无需额外验证。

posted @ 2026-06-28 07:17  kkman2000  阅读(4)  评论(0)    收藏  举报