陶陶摘苹果(升级版)
题目描述
又是一年秋季时,陶陶家的苹果树结了 n n n 个果子。陶陶又跑去摘苹果,这次他有一个 a a a 公分的椅子。当他手够不着时,他会站到椅子上再试试。
这次与 NOIp2005 普及组第一题不同的是:陶陶之前搬凳子,力气只剩下 s s s 了。当然,每次摘苹果时都要用一定的力气。陶陶想知道在 s < 0 s<0 s<0 之前最多能摘到多少个苹果。
现在已知 n n n 个苹果到达地上的高度 x i x_i xi,椅子的高度 a a a,陶陶手伸直的最大长度 b b b,陶陶所剩的力气 s s s,陶陶摘一个苹果需要的力气 y i y_i yi,求陶陶最多能摘到多少个苹果。
输入格式
第 1 1 1 行:两个数 苹果数 n n n,力气 s s s。
第 2 2 2 行:两个数 椅子的高度 a a a,陶陶手伸直的最大长度 b b b。
第 3 3 3 行~第 3 + n − 1 3+n-1 3+n−1 行:每行两个数 苹果高度 x i x_i xi,摘这个苹果需要的力气 y i y_i yi。
输出格式
只有一个整数,表示陶陶最多能摘到的苹果数。
输入输出样例
输入 #1
8 15
20 130
120 3
150 2
110 7
180 1
50 8
200 0
140 3
120 2
输出 #1
4
提示
对于 100 % 100\% 100% 的数据, n ≤ 5000 n\leq 5000 n≤5000, a ≤ 50 a\leq 50 a≤50, b ≤ 200 b\leq 200 b≤200, s ≤ 1000 s\leq 1000 s≤1000, x i ≤ 280 x_i\leq 280 xi≤280, y i ≤ 100 y_i\leq 100 yi≤100。
1.思路解析
一眼贪心。
贪心策略
:将苹果高度从大到小
排序,每一次摘一个高度最低的苹果。
证明
:最优选择问题
注意
:此题需要先把摘不到的苹果筛选掉,才能保证程序的正确性。
2.AC代码
#include<bits/stdc++.h>
using namespace std;
struct apple//储存每个苹果的信息
{
int x,y;
apple(){}
apple(int _x,int _y):x(_x),y(_y){}
}ap[5010];
bool cmp(apple a,apple b)//需要力气小的苹果优先摘下
{
return a.y<b.y;
}
int main()
{
int n,s,a,b,cnt=0,ans=0;
cin>>n>>s>>a>>b;
//贪心策略:先把摘不到的苹果筛选掉,剩下的苹果优先摘下需要力气小的
for(int i=1;i<=n;i++)
{
int x,y;
cin>>x>>y;
if(a+b>=x)//如果陶陶加板凳可以够到
ap[++cnt]=apple(x,y);
}
sort(ap+1,ap+cnt+1,cmp);//排序
for(int i=1;i<=cnt&&s;i++)//遍历
if(s>=ap[i].y)//如果可以摘下
{
s-=ap[i].y;
ans++;
}
else break;
cout<<ans;
return 0;
}
喜欢就订阅此专辑吧!
【蓝胖子编程教育简介】
蓝胖子编程教育,是一家面向青少年的编程教育平台。平台为全国青少年提供最专业的编程教育服务,包括提供最新最详细的编程相关资讯、最专业的竞赛指导、最合理的课程规划等。本平台利用趣味性和互动性强的教学方式,旨在激发孩子们对编程的兴趣,培养他们的逻辑思维能力和创造力,让孩子们在轻松愉快的氛围中掌握编程知识,为未来科技人才的培养奠定坚实基础。
欢迎扫码关注蓝胖子编程教育