洛谷-L1478-陶陶摘苹果(升级版)

陶陶摘苹果(升级版)

题目描述

又是一年秋季时,陶陶家的苹果树结了 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+n1 行:每行两个数 苹果高度 x i x_i xi,摘这个苹果需要的力气 y i y_i yi

输出格式

只有一个整数,表示陶陶最多能摘到的苹果数。

样例 #1

样例输入 #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 n5000, a ≤ 50 a\leq 50 a50, b ≤ 200 b\leq 200 b200, s ≤ 1000 s\leq 1000 s1000, x i ≤ 280 x_i\leq 280 xi280, y i ≤ 100 y_i\leq 100 yi100

解析

这是一道典型的贪心问题,但是又不是很难,用简单的排序就可以了。
题目中涉及了力量这个因素,但是用1点力量和用5点力量摘掉的苹果又是一样的,所以可以对力量进行排序。
每个苹果都有两个数据:高度,摘掉所需力量。所以可以定义一个结构体:

struct apple{//定义结构体APPLE
int high;
int get;
}ale[5005];

这样就可以进行数据存储了,接下来就是sort排序,如果不知道什么事sort排序,可以看看我的博文
sort

AC CODE

#include <bits/stdc++.h>

using namespace std;
struct apple{//定义结构体APPLE
int high;
int get;
}ale[5005];
bool cmp(apple a,apple b){
    return a.get<b.get;
}
int n,s,a,b;
int main()
{
    //freopen("C:\\Users\\Sunsh\\Downloads\\P1478_3.in","r",stdin);
   cin>>n>>s>>a>>b;
for(int i=1;i<=n;i++){
cin>>ale[i].high>>ale[i].get;//输入数据
    
}
sort(ale+1,ale+1+n,cmp);//从小到大排序
int ans=0,now=1;
while(s&& now<=n){
if(ale[now].high<=b+a && ale[now].get<=s){
    ans++;
    //te
    s-=ale[now].get;
    
}
now++;//下一个苹果
}
// for(int i=1;i<=n;i++){
// cout<<ale[i].high<<ale[i].get<<endl;//输chu数据
    
// }
cout<<ans;
   return 0;
}
//https://www.luogu.com.cn/problem/P1478

文章结束了,有帮助的请给个三连,谢谢

### 关于P1478陶陶摘苹果升级版题目解析 #### 题目描述 给定n个苹果到达地面的高度`xi`,椅子的高度`a`,陶陶手伸直的最大长度`b`,以及陶陶剩余的力气`s`。对于每一个苹果,给出其距离地面的具体高度,并且提供摘取该苹果所需的特定力气值`yi`。目标是在陶陶的力气耗尽前(`s<0`)计算并返回能够成功摘得的苹果数量最大值。 #### 数据输入格式说明 程序接收一系列参数作为输入数据,具体包括但不限于: - 苹果总数`n` - 椅子增加后的总可达高度`(a+b)` - 剩余可用力气总量`s` - 接下来的一系列成对的数据代表各个苹果离地的实际高度及其对应的采摘所需耗费的力量[^2] #### 解决方案概述 为了使陶陶能够在有限的体力范围内获取尽可能多的果实,合理的策略是对所有待选对象按照其所需付出的努力程度从小到大排序;优先处理那些成本较低的任务可以有效提升整体效率。因此,在此情境下应当首先考虑按升序排列各苹果对应的需求力量列表,之后逐一尝试收集直到无法继续为止[^3]。 #### 实现细节分析 考虑到上述逻辑流程,下面是一个基于C++语言实现这一算法思路的例子: ```cpp #include <iostream> #include <vector> #include <algorithm> using namespace std; struct Apple { int height; int effort; }; bool compare(Apple a, Apple b){ return a.effort < b.effort; } int main(){ int n,a,b,s,x,y; cin>>n>>a>>b>>s; vector<Apple> apples(n); for(int i=0;i<n;++i){ cin >> x >> y; if(x<=a+b){ // 只记录可触及范围内的苹果 apples[i].height=x; apples[i].effort=y; }else{ apples[i].effort=s+1; // 将不可达苹果标记为不可能被选择的状态 } } sort(apples.begin(),apples.end(),compare); int count = 0; for(auto &apple : apples){ if(s>=apple.effort && apple.effort!=s+1){ ++count; s-=apple.effort; } } cout<<count<<"\n"; } ``` 通过这段代码实现了对问题的有效解决方法,即先过滤掉超出能力范围的目标,接着依据消耗代价由低至高遍历筛选符合条件的对象直至资源不足以支撑进一步行动。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值