1060 爱丁顿数 Python 实现与解析
英国天文学家爱丁顿定义的'爱丁顿数'E,是指满足有 E 天骑车超过 E 英里的最大整数。这个概念听起来有点绕,但转化为编程逻辑其实非常直观。
核心思路
拿到这道题,核心在于理解'E 天超过 E 英里'的含义。如果我们将每天的骑行距离从大到小排序,那么对于第 k 天(索引为 k-1),如果当天的距离大于 k,就意味着至少有 k 天骑行了超过 k 英里。
举个例子,假设排序后的距离列表是 [10, 8, 7, 6, 3, 2]。
- 第 1 天(索引 0):10 > 1,成立。
- 第 2 天(索引 1):8 > 2,成立。
- 第 3 天(索引 2):7 > 3,成立。
- 第 4 天(索引 3):6 > 4,成立。
- 第 5 天(索引 4):3 > 5,不成立。
所以最大的 E 就是 4。这种贪心策略配合排序,时间复杂度主要消耗在排序上,对于 N<=10^5 的数据规模完全没问题。
代码实现
这里直接给出完整的 Python 实现,为了便于理解,我把关键步骤拆分开来。
# 读取天数 N
n = int(input())
# 读取每天的骑行距离列表
m = list(map(int, input().split()))
# 降序排序,这样大的距离排在前面
m.sort(reverse=True)
E = 0
# 遍历排序后的列表
for i in range(n):
# 当前是第 i+1 天,如果距离大于 i+1,则满足条件
if m[i] > i + 1:
E += 1
else:
# 一旦不满足,后面的肯定也不满足(因为距离在减小,天数在增加)
break
print(E)
关键点解析
- 排序方向:必须用
reverse=True降序排列。如果我们从小到大排,就无法直接通过索引判断'有多少天超过了某个值'。 - 循环终止:代码中加了
break优化。因为数组已经有序,一旦m[i] <= i + 1,后续更大的索引对应的i+1只会更大,而m[i]只会更小或相等,不可能再满足条件了。 - 输入处理:注意
input().split()会自动处理空格分隔的多个数字,不需要手动循环读取。
这套逻辑在 Python 中运行效率很高,利用内置的 Timsort 算法,整体复杂度控制在 O(N log N),轻松通过评测。

