1 条题解
-
0
陶陶摘苹果
一个自然的想法
10 个苹果各有高度,陶陶伸手能达到的高度是 h,踩上 30 厘米的板凳后能够到的高度就是 h + 30。逐个比较:苹果高度不超过 h + 30 就能摘到,统计个数。
想法本身没有漏洞,真正要做对,得把两句话读仔细。
突破口:读懂两句关键的话
第一句:"当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试"。这句话说明板凳是能踩的,所以判断标准不是"高度 ≤ h",而是"高度 ≤ h + 30"。换句话说,苹果高度只要不超过 h + 30 都算能摘到——注意"不超过"包含恰好等于。
第二句:"假设她碰到苹果,苹果就会掉下来"。这句话只是保证每个苹果最多贡献一次计数,不影响判断条件。
数苹果是重复劳动,正适合用循环处理:每读一个高度,判断一次,满足就把计数器加一。循环要到第三章才正式讲,这里提前见一面——它的结构就是"重复读入 + 条件判断 + 计数"。
代码实现
代码里有一个容易忽略的顺序问题:伸手高度虽然在输入的第二行,但每一轮比较都依赖它,所以要先把它读进来:
#include <stdio.h> int main() { int height, h, count = 0; scanf("%d", &h); /* 先读伸手高度 */ for (int i = 0; i < 10; i++) { scanf("%d", &height); if (height <= h + 30) count++; } printf("%d\n", count); return 0; }用样例验证:伸手高度 110,能摘到的上限是 140。十个苹果 100 200 150 140 129 134 167 198 200 111 中,不超过 140 的有 100、140、129、134、111,共 5 个 ✓。
容易出错的细节
- 判断条件是
<=而不是<:恰好等于 h + 30 的苹果(样例里的 140)能摘到,写成小于会少算一个。 - 输入顺序:伸手高度在第二行,但比较依赖它,所以代码里要先读 h——输入顺序和计算顺序不必一致。
- 计数器
count必须初始化为 0:局部变量不初始化时是随机值,最后的结果会莫名其妙。
复杂度
读 10 个数、判断 10 次,时间复杂度 O(10) = O(1),空间 O(1)。
这题的本质:遍历 + 条件 + 计数,这是统计类问题的最小模型,后面"统计素数个数""统计单词数"都是它的变体。
- 判断条件是
- 1
信息
- ID
- 527
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者