BZOJ3174:[Tjoi2013]拯救小矮人 贪心+dp
思路:
假设在能逃出相同多数目的小矮人的情况下,我们更愿意让逃生能力更强的小矮人留到最后.
逃生能力就是指\(a_i+b_i\),也即在下面垫的总高度确定时更容易达到更高的高度.
这样我们就有了一个贪心选择顺序,我们设\(f[i]\)表示逃生了\(i\)个小矮人时下面垫的总高度的最大值,并依据这个判定能否再逃出一人即可.
#include<cstdio>
#include<cstring>
#include<cctype>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 2010
struct Case{int a,b;bool operator<(const Case&B)const{return a+b<B.a+B.b;}}S[N];
int f[N];
int main(){
int n,m;scanf("%d",&n);register int i,j;for(i=1;i<=n;++i)scanf("%d%d",&S[i].a,&S[i].b);
sort(S+1,S+n+1);
scanf("%d",&m);
memset(f,-1,sizeof f);for(f[0]=0,i=1;i<=n;++i)f[0]+=S[i].a;
int ans=0;
for(i=1;i<=n;++i){
for(j=ans;j>=0;--j){
if(f[j]+S[i].b>=m)f[j+1]=max(f[j+1],f[j]-S[i].a);
}if(f[ans+1]>=0)++ans;
}
printf("%d\n",ans);
return 0;
}
评论 (0)