题解:P1478 陶陶摘苹果(升级版)
题意简述
对于每一个苹果有两个值,分别是高度 \(x_i\) 和摘下来需要的力气 \(y_i\)。最大化可摘到的苹果数量。
观察题目不难发现陶陶可以摘到的苹果高度满足 \(x_i \leq a+b\),也就是说只要高度比 \(h=a+b\) 低的苹果就都可以摘到。
思路
很自然的就能想到贪心策略,每次摘苹果都尽可能摘需要力气更少的。
因此将 \(n\) 苹果按照所需力气的大小从小到大排序,再依次判断是否能够摘到,具体操作如下:
- 如果能摘到就摘下来,因为用更少的力气摘苹果显然是更优策略。
- 如果不能摘到,要么是高度不够,则跳过这一个苹果;要么是力气不够,那显然后面需要更多力气的苹果也不能摘了,此时结束程序。
因此进行排序就可以了。使用一个结构体存储每一个苹果的数据,然后对结构体数组排序,最后依次遍历,代码就完成了。
代码
#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;
}
本文来自博客园,作者:Circle_Table,转载请注明原文链接:https://www.cnblogs.com/Circle-Table/articles/19501270

浙公网安备 33010602011771号