[NOIP 2005 普及组] 陶陶摘苹果 的题解
记住只在没有思路时使用题解,不要从它复制粘贴代码。请尊重题目和题解的作者。
在解题之前提交题解的代码会导致封禁。
在解题之前提交题解的代码会导致封禁。
作者:
概述
本题要求计算陶陶能够摘到的苹果数目:已知 个苹果到地面的高度和陶陶伸手可达的最大高度
,她还可以再踩上
厘米高的板凳。核心解法是把“能否摘到”转化为苹果高度与可达高度
的大小比较,再对这
个苹果逐个计数。
分析
核心观察
对每个苹果而言,判断标准完全相同:苹果离地高度不超过“踩着板凳再伸直手”的可达高度即可摘到。这个可达高度是一个与苹果无关的常量。
思路
陶陶伸手可达的高度为 厘米,板凳高
厘米,因此踩上板凳后手能够到的最大高度为
设第 个苹果离地面的高度为
,由题意,该苹果能被摘到当且仅当
题目假设“碰到苹果,苹果就会掉下来”,即摘下一个苹果不会影响其他苹果,因此各个苹果的判定互相独立,答案就是把所有满足 的苹果个数相加。由于苹果数量固定为
,直接逐个比较即可,无需排序或前缀和等更复杂的统计手段。
具体示例
以 号测试点为例,手高
,板凳高
,可达高度为
高度不超过 的苹果有
、
、
、
、
,共
个,故答案为
。其中高度恰为
的苹果正好落在阈值上,同样可以摘到,可见比较必须取等号。
算法步骤
- 读入
个苹果的高度存入数组
a,再读入手能够到的最大高度h。 - 计算踩上板凳后的可达高度
limit,即。
- 令计数器
ans为,依次检查
a中的每个元素,不超过limit时把ans加。
- 输出
ans。
复杂度分析
- 时间:
,苹果数量固定为
,比较次数为常数。
- 空间:
,只需常数个变量存放高度与计数。
实现注意事项
- 判断条件是“小于等于”而非“小于”:苹果高度恰好等于
时同样能摘到。
- 第一行的
个整数与第二行的手高都要读入,注意换行只分隔数据,不影响读入顺序。
- 数据范围保证高度均为
到
之间的整数,手高为
到
之间的整数,均可用 int 存放,不存在溢出问题。
- 苹果个数固定为
,不需要处理数量不定的输入。
- 输出仅一个整数,注意行末换行。
源代码
#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()
评论