题目
又是一年秋季时,陶陶家的苹果树结了 nn 个果子。陶陶又跑去摘苹果,这次他有一个 aa 公分的椅子。当他手够不着时,他会站到椅子上再试试。
这次与 NOIp2005 普及组第一题不同的是:陶陶之前搬凳子,力气只剩下 ss 了。当然,每次摘苹果时都要用一定的力气。陶陶想知道在 s<0s<0 之前最多能摘到多少个苹果。
现在已知 nn 个苹果到达地上的高度 x_ixi,椅子的高度 aa,陶陶手伸直的最大长度 bb,陶陶所剩的力气 ss,陶陶摘一个苹果需要的力气 y_iyi,求陶陶最多能摘到多少个苹果。
输入格式
第 11 行:两个数 苹果数 nn,力气 ss。
第 22 行:两个数 椅子的高度 aa,陶陶手伸直的最大长度 bb。
第 33 行~第 3+n-13+n−1 行:每行两个数 苹果高度 x_ixi,摘这个苹果需要的力气 y_iyi。
输出格式
只有一个整数,表示陶陶最多能摘到的苹果数。
本题考查重点 贪心
思路如下:
将花费力气从小到大排序,然后判断是否够的到
代码
#include<bits/stdc++.h>
using namespace std;
int n; //苹果总个数
double s, a, b; //s:总力气, a:椅子高度,b:伸手狗着的高度
struct apple{
double x, y; //x:苹果的高度, y:耗费的力气
} app[5002];
// 排序:苹果高度从小到大
bool cmp(apple a1, apple a2){
return a1.y<a2.y;
}
int main(){
scanf("%d %lf", &n, &s);
scanf("%lf %lf", &a, &b);
for(int i=1; i<=n; i++){
cin >> app[i].x >> app[i].y;
}
sort(app+1, app+1+n, cmp);
double sum=0;
int cnt=0;
for(int i=1; i<=n; i++){
if(app[i].x<=(a+b)){
sum+=app[i].y;
if(sum<=s){
cnt++;
}
else{
break;
}
}
}
printf("%d\n", cnt);
return 0;
}