题解:P1478 陶陶摘苹果(升级版)

题目传送门。

题意简述

对于每一个苹果有两个值,分别是高度 \(x_i\) 和摘下来需要的力气 \(y_i\)。最大化可摘到的苹果数量。

观察题目不难发现陶陶可以摘到的苹果高度满足 \(x_i \leq a+b\),也就是说只要高度比 \(h=a+b\) 低的苹果就都可以摘到。

思路

很自然的就能想到贪心策略,每次摘苹果都尽可能摘需要力气更少的。

因此将 \(n\) 苹果按照所需力气的大小从小到大排序,再依次判断是否能够摘到,具体操作如下:

  1. 如果能摘到就摘下来,因为用更少的力气摘苹果显然是更优策略。
  2. 如果不能摘到,要么是高度不够,则跳过这一个苹果;要么是力气不够,那显然后面需要更多力气的苹果也不能摘了,此时结束程序。

因此进行排序就可以了。使用一个结构体存储每一个苹果的数据,然后对结构体数组排序,最后依次遍历,代码就完成了。

代码

#include<bits/stdc++.h>
using namespace std;
const int N=5005;
int n,s,h1,h2,h,ans;
struct node{
    int x,y;
}a[N];

bool cmp(node p,node q){
    return p.y<q.y; // 按所需力气大小排序
}

int main(){
    cin>>n>>s;
    cin>>h1>>h2;
    h=h1+h2;
    for(int i=1;i<=n;i++){
        cin>>a[i].x>>a[i].y;
    }
    sort(a+1,a+1+n,cmp);
    for(int i=1;i<=n;i++){
        if(s<a[i].y)break; // 力气不够
        if(h>=a[i].x)ans++,s-=a[i].y; // 高度不够
    }
    cout<<ans<<'\n';
    return 0;
}
posted @ 2026-01-19 13:28  Circle_Table  阅读(7)  评论(0)    收藏  举报