题目描述
又是一年秋季时,陶陶家的苹果树结了 n 个果子。陶陶又跑去摘苹果,这次他有一个 a 公分的椅子。当他手够不着时,他会站到椅子上再试试。
这次与 NOIp2005 普及组第一题不同的是:陶陶之前搬凳子,力气只剩下 s 了。当然,每次摘苹果时都要用一定的力气。陶陶想知道在s<0之前最多能摘到多少个苹果。
现在已知 n 个苹果到达地上的高度 x,椅子的高度 a,陶陶手伸直的最大长度 b,陶陶所剩的力气 s,陶陶摘一个苹果需要的力气 y,求陶陶最多能摘到多少个苹果。
输入格式
第 1 行:两个数 苹果数 n,力气 s。
第 2 行:两个数 椅子的高度 a,陶陶手伸直的最大长度 b。
第 3 行~第 3+n-1行:每行两个数 苹果高度 x,摘这个苹果需要的力气 y。
输出格式
只有一个整数,表示陶陶最多能摘到的苹果数。
#include<iostream>
#include<algorithm>
using namespace std;
struct node {
int hign;
int y;
};//苹果高度 hign,摘这个苹果需要的力气 y
int cmp(struct node a, struct node b) {//比较函数
if (a.y == b.y)
{
return a.hign < b.hign;
}
else
return a.y < b.y;
}
int main() {
struct node apple[5001];
int n, s;//苹果数 n,力气 s
cin >> n >> s;
int a, b, sum = 0;//椅子的高度 a,陶陶手伸直的最大长度 b,sum是最终采到的苹果数
cin >> a >> b;
for (int i = 0; i < n; i++) {
cin >> apple[i].hign >> apple[i].y;
}
sort(apple, apple + n, cmp);
for (int i = 0; i < n; i++) {
if (s <= 0)
break;
if (a + b >= apple[i].hign && s >= apple[i].y) {//陶陶能够着苹果,而且有力气摘下来
s -= apple[i].y;//陶陶耗费了相应的力气
sum++;//苹果数加一
}
}
cout << sum;
return 0;
}
使用sort函数效率比较高,精髓在于cmp,根据自己想法随意设置。
该题提交了两次不能AC,一步步调试发现边界条件设置错误,没有把恰好够到苹果的极限条件算上去,加上等号即可。
多多调试,让思维发散,考虑到更多情况。
这篇博客讲述了陶陶在秋季摘苹果的问题,他在一个a公分的椅子上尝试摘n个苹果,每个苹果需要花费一定的力气y。由于力气限制s,问题转化为在力气耗尽前最多能摘多少个苹果。通过输入苹果高度、手伸直长度和力气值等信息,利用sort函数和cmp进行优化计算,解决边界条件错误后成功找到答案。强调调试和考虑多种情况的重要性。
1900

被折叠的 条评论
为什么被折叠?



