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

· · 题解

想法很简单,估计大佬一看就懂:我想,一个苹果对应一个力量值以及一个高度,那不如按照力量排序,能达到高度并且力量值最小的优先,那我们定义一个bool类型的排序规则按照力量从小到大的顺序

下面会有注释哟。

#include<cstdio>
#include<algorithm>
using namespace std;
int n,s,a,b,ans;

struct apple{//结构体定义苹果以及高度和摘取所用的力量
    int high,pow;
}app[5010];

inline bool cmp(apple x,apple y){
    return x.pow<y.pow;
}

inline int canget(apple x)//判断是否可以摘,如果可以摘就返回1,否则随便返回吧
{
    if(x.high<=a+b)return 1;
    else return 99;
}
int main (){

    scanf("%d%d%d%d",&n,&s,&a,&b);
    for (int i=1;i<=n;i++)
    {
        scanf("%d%d",&app[i].high,&app[i].pow);
    }

    sort(app+1,app+1+n,cmp);//按照力量值排
    for (int i=1;i<=n;i++)
    {
        if (canget(app[i])==1)//如果可以摘苹果,就让力量值减去这个苹果所需要的力量
        {
            s-=app[i].pow;
            if(s<0)break;//如果没力量了,那就结束吧
        else ans++;否则,能摘得数量++
        }

    }
    printf("%d",ans);
    return 0;
}