zoukankan      html  css  js  c++  java
  • [TJOI2013][BZOJ3174] 拯救小矮人

    3174: [Tjoi2013]拯救小矮人

    Time Limit: 1 Sec  Memory Limit: 128 MB
    Submit: 445  Solved: 217
    [Submit][Status][Discuss]

    Description

    一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯。即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口。对于每一个小矮人,我们知道他从脚到肩膀的高度Ai,并且他的胳膊长度为Bi。陷阱深度为H。如果我 们利用矮人1,矮人2,矮人3,。。。矮人k搭一个梯子,满足A1+A2+A3+....+Ak+Bk>=H,那么矮人k就可以离开陷阱逃跑了,一 旦一个矮人逃跑了,他就不能再搭人梯了。
    我们希望尽可能多的小矮人逃跑, 问最多可以使多少个小矮人逃跑。

    Input

    第一行一个整数N, 表示矮人的个数,接下来N行每一行两个整数Ai和Bi,最后一行是H。(Ai,Bi,H<=10^5)

    Output

    一个整数表示对多可以逃跑多少小矮人

    Sample Input

    样例1

    2
    20 10
    5 5
    30

    样例2
    2
    20 10
    5 5
    35

    Sample Output

    样例1
    2

    样例2
    1

    HINT

    数据范围

    30%的数据 N<=200

    100%的数据 N<=2000

    如果我们用一个小矮人的a[i]+b[i]来衡量他的逃跑能力,那么a[i]+b[i]小的一定比大的先出去,这样才能保证跑后的剩余高度更大,使得最大可能的往外跑。

    贪心的正确性验证了,就按照a[i]+b[i]为关键字从小到大排序。但这只是一个最优序列,若可行可保证最优,但并非每次都可行,所以dp一下。

    f[i]表示出去i个人时,剩余的最大高度。

    初始f[i]=-1,表示不可能出去i个人。令f[0]=sigma(a[i])。

    然后按照贪心的顺序加人,没加一个人就把f[sum(当前跳出人的数量)]->f[1]更新一遍看是否更优。并判断第sum+1人是否可以跳出去,以此更新到底即可。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    struct node
    {
        int a,b;
    }h[2001];
    int n,H,sum,f[2001];
    bool cmp(node a,node b)
    {
        return a.a+a.b<b.a+b.b;
    }
    int main()
    {
        scanf("%d",&n);
        for (int i=1;i<=n;i++)
            scanf("%d%d",&h[i].a,&h[i].b);
        sort(h+1,h+n+1,cmp);
        memset(f,-1,sizeof(f));
        f[0]=0;
        for (int i=1;i<=n;i++) f[0]+=h[i].a;
        scanf("%d",&H);
        int sum=0;
        for (int i=1;i<=n;i++)
            for (int j=sum;j>=0;j--)
            {
                if (f[j]+h[i].b>=H)
                    f[j+1]=max(f[j+1],f[j]-h[i].a);
                if (f[sum+1]>=0) sum++;
            }
        printf("%d",sum);
        return 0;
    }
  • 相关阅读:
    14款经典的MySQL客户端软件
    淘宝、百度软件工程师们小调皮,各种霸气外漏
    使用Navicat for Oracle工具连接oracle出错:ORA-12737
    解析xlsx与xls--使用2012poi.jar
    LUOGU P4163 [SCOI2007]排列
    LUOGU P1337 [JSOI2004]平衡点 / 吊打XXX(模拟退火)
    LUOGU P1438 无聊的数列 (差分+线段树)
    LUOGU P1967 货车运输(最大生成树+树剖+线段树)
    LUOGU P3382 【模板】三分法 (三分)
    LUOGU P4027 [NOI2007]货币兑换 (斜率优化+CDQ分治)
  • 原文地址:https://www.cnblogs.com/ws-fqk/p/4643266.html
Copyright © 2011-2022 走看看