您的位置:首页 > 其它

BZOJ 3174: [Tjoi2013]拯救小矮人

2017-02-18 09:39 369 查看
不会做,看了各种题解都不理解后来看这篇看懂了,这篇我觉得是我看的写的最好的了,关键就是最后小矮人跑出去的序列一定是一个身高+臂长递增的序列(意会一下?),所以按这个排序是为了DP,然后设f[i]为出去i个人后剩下人的最大高度DP

#include<set>
#include<map>
#include<deque>
#include<queue>
#include<stack>
#include<cmath>
#include<ctime>
#include<bitset>
#include<string>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<climits>
#include<complex>
#include<iostream>
#include<algorithm>
#define ll long long
#define lowbit(x) x&(-x)
using namespace std;

void up(int &x,int y){if(x<y)x=y;}
void down(int &x,int y){if(x>y)x=y;}
const int maxn = 2100;

struct node
{
int a,b;
}a[maxn];
int n,H;
bool cmp(node x,node y){return x.a+x.b<y.a+y.b;}

int f[maxn];

int main()
{
scanf("%d",&n); int sum=0;
for(int i=1;i<=n;i++) scanf("%d%d",&a[i].a,&a[i].b),sum+=a[i].a;
scanf("%d",&H);
sort(a+1,a+n+1,cmp);

memset(f,-1,sizeof f);
f[0]=sum;
for(int i=1;i<=n;i++)
{
for(int j=n;j>=1;j--)
if(f[j-1]!=-1&&f[j-1]+a[i].b>=H) up(f[j],f[j-1]-a[i].a);
}
int ans;
for(ans=1;ans<=n;ans++) if(f[ans]==-1) break;
printf("%d\n",ans-1);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: