bzoj千题计划208:bzoj3174: [Tjoi2013]拯救小矮人

Posted 日拱一卒 功不唐捐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj千题计划208:bzoj3174: [Tjoi2013]拯救小矮人相关的知识,希望对你有一定的参考价值。

http://www.lydsy.com/JudgeOnline/problem.php?id=3174

 

按a+b从小到大排序,a+b小的在上面,先考虑让它逃出去

正确性不会证

感性理解一下,最后一个可以达到的最高高度为a+b,显然它越大越能逃出去

 

f[i][j] 表示前i个逃出去j个后,剩余的最大高度

如果f[j]+b[i]>=H,f[j+1]=max(f[j]-a[i])

 

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
 
using namespace std;
 
#define N 2001
 
struct node
{
    int a,b;
}e[N];
 
int f[N];
 
void read(int &x)
{
    x=0; char c=getchar();
    while(!isdigit(c)) c=getchar();
    while(isdigit(c)) { x=x*10+c-0; c=getchar(); }
}
 
bool cmp(node p,node q)
{
    return p.a+p.b<q.a+q.b;
}
 
int main()
{
    int n;
    read(n);
    int sum=0;
    memset(f,-1,sizeof(f));
    f[0]=0;
    for(int i=1;i<=n;++i) 
    {
        read(e[i].a);read(e[i].b);
        f[0]+=e[i].a;
    }
    int h;
    read(h);
    sort(e+1,e+n+1,cmp);
    int ans=0;
    for(int i=1;i<=n;++i)
    {
        for(int j=ans;j>=0;--j)  
            if(f[j]+e[i].b>=h) f[j+1]=max(f[j+1],f[j]-e[i].a);
        if(f[ans+1]>=0) ans++;
    }
    cout<<ans;
}

 

以上是关于bzoj千题计划208:bzoj3174: [Tjoi2013]拯救小矮人的主要内容,如果未能解决你的问题,请参考以下文章

bzoj千题计划197:bzoj4247: 挂饰

bzoj千题计划118:bzoj1028: [JSOI2007]麻将

bzoj千题计划165:bzoj5127: 数据校验

bzoj千题计划144:bzoj1176: [Balkan2007]Mokia

bzoj千题计划177:bzoj1858: [Scoi2010]序列操作

bzoj千题计划142:bzoj3144: [Hnoi2013]切糕