1 条题解

  • 0
    @ 2026-10-8 21:09:26

    陶陶摘苹果

    一个自然的想法

    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 个 ✓。

    容易出错的细节

    1. 判断条件是 <= 而不是 <:恰好等于 h + 30 的苹果(样例里的 140)能摘到,写成小于会少算一个。
    2. 输入顺序:伸手高度在第二行,但比较依赖它,所以代码里要先读 h——输入顺序和计算顺序不必一致。
    3. 计数器 count 必须初始化为 0:局部变量不初始化时是随机值,最后的结果会莫名其妙。

    复杂度

    读 10 个数、判断 10 次,时间复杂度 O(10) = O(1),空间 O(1)。

    这题的本质:遍历 + 条件 + 计数,这是统计类问题的最小模型,后面"统计素数个数""统计单词数"都是它的变体。

    • 1

    【深基3.习7】[NOIP2005 普及组] 陶陶摘苹果

    信息

    ID
    527
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者