码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-01-10 11:38:23      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:16px   pos   blank   bsp   cout   oid   include   计划   div   

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]拯救小矮人

标签:16px   pos   blank   bsp   cout   oid   include   计划   div   

原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/8256847.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!