题目大意:一些人身体长ai手长bi
用其中一些人并让某个人i在顶上使得a1+a2+⋯+ai+bi>=h那么最顶上的人就能出去
询问最大出去的人数
题解:贪心来做比较显然……看起来应该把逃生能力强的放在下面,我做的时候一直在想应该把手短的排在上面还是把矮的排在上面,看了题解发现按照x+y排……
然而,这个题实际上是一个dp……贪心的排序只是为了实现方便
感性的证明后,用
f[i]
表示逃跑了i个人后剩余的最大高度,初始
f[i]=−1
,表示不可能出去
i
<script id="MathJax-Element-60" type="math/tex">i</script>个人,f[0]=sigma(a[i].x),按照贪心的排序加人,更新答案即可
我的收获:跪跪跪贪心
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int M=2005;
int n,h,f[M];
struct peo{int x,y;}a[M];
bool operator <(peo a,peo b){return a.x+a.y<b.x+b.y;}
void work()
{
int ans=0;
for(int i=1;i<=n;i++)
{
for(int j=ans;j>=0;j--)
if(f[j]+a[i].y>=h)
f[j+1]=max(f[j+1],f[j]-a[i].x);
if(f[ans+1]>=0) ans++;
}
cout<<ans<<endl;
}
void init()
{
memset(f,-1,sizeof(f));f[0]=0;
cin>>n;
for(int i=1;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y),f[0]+=a[i].x;
cin>>h;
sort(a+1,a+1+n);
}
int main()
{
init();
work();
return 0;
}