[NOIP 2005 普及组] 陶陶摘苹果 的题解


记住只在没有思路时使用题解,不要从它复制粘贴代码。请尊重题目和题解的作者。
在解题之前提交题解的代码会导致封禁。

作者: admin

概述

本题要求计算陶陶能够摘到的苹果数目:已知 10 个苹果到地面的高度和陶陶伸手可达的最大高度 h,她还可以再踩上 30 厘米高的板凳。核心解法是把“能否摘到”转化为苹果高度与可达高度 h + 30 的大小比较,再对这 10 个苹果逐个计数。

分析
核心观察

对每个苹果而言,判断标准完全相同:苹果离地高度不超过“踩着板凳再伸直手”的可达高度即可摘到。这个可达高度是一个与苹果无关的常量。

思路

陶陶伸手可达的高度为 h 厘米,板凳高 30 厘米,因此踩上板凳后手能够到的最大高度为

\displaystyle  H = h + 30

设第 i 个苹果离地面的高度为 a_i,由题意,该苹果能被摘到当且仅当

\displaystyle  a_i \le h + 30

题目假设“碰到苹果,苹果就会掉下来”,即摘下一个苹果不会影响其他苹果,因此各个苹果的判定互相独立,答案就是把所有满足 a_i \le h + 30 的苹果个数相加。由于苹果数量固定为 10,直接逐个比较即可,无需排序或前缀和等更复杂的统计手段。

具体示例

以 1 号测试点为例,手高 h = 110,板凳高 30,可达高度为

\displaystyle  H = 110 + 30 = 140

高度不超过 140 的苹果有 100、140、129、134、111,共 5 个,故答案为 5。其中高度恰为 140 的苹果正好落在阈值上,同样可以摘到,可见比较必须取等号。

算法步骤
  1. 读入 10 个苹果的高度存入数组 a,再读入手能够到的最大高度 h。
  2. 计算踩上板凳后的可达高度 limit,即 h + 30。
  3. 令计数器 ans 为 0,依次检查 a 中的每个元素,不超过 limit 时把 ans 加 1。
  4. 输出 ans。
复杂度分析
  • 时间:O(1),苹果数量固定为 10,比较次数为常数。
  • 空间:O(1),只需常数个变量存放高度与计数。
实现注意事项
  • 判断条件是“小于等于”而非“小于”:苹果高度恰好等于 h + 30 时同样能摘到。
  • 第一行的 10 个整数与第二行的手高都要读入,注意换行只分隔数据,不影响读入顺序。
  • 数据范围保证高度均为 100 到 200 之间的整数,手高为 100 到 120 之间的整数,均可用 int 存放,不存在溢出问题。
  • 苹果个数固定为 10,不需要处理数量不定的输入。
  • 输出仅一个整数,注意行末换行。
源代码
#include <bits/stdc++.h>
using namespace std;

int main() {
    int a[10];
    for (int i = 0; i < 10; ++i) {
        cin >> a[i];
    }

    int h;
    cin >> h;
    int limit = h + 30;

    int ans = 0;
    for (int i = 0; i < 10; ++i) {
        if (a[i] <= limit) {
            ++ans;
        }
    }

    cout << ans << endl;
    return 0;
}
def main():
    a = list(map(int, input().split()))
    h = int(input())
    limit = h + 30
    print(sum(1 for x in a if x <= limit))


main()

评论

目前没有评论。