zoukankan      html  css  js  c++  java
  • POJ2392 Space Elevator

    题目:http://poj.org/problem?id=2392

    一定要先按高度限制由小到大排序!

    不然就相当于指定了一个累加的顺序,在顺序中是不能做到“只放后面的不放前面的”这一点的!

    数组是四十万,不是四万。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int n,v[1605],l[1605],cnt,mx;
    bool d[400005];
    struct Node{
        int c,a,h;
    }r[405];
    void fen(int k)
    {
        int tmp=1,mul=1;
        while(mul<=r[k].c)
        {
            v[++cnt]=tmp*r[k].h;
            l[cnt]=r[k].a;
    //        printf("v=%d l=%d ",v[cnt],l[cnt]);
    //        printf("cnt=%d
    ",cnt);
            tmp<<=1;
            mul+=tmp;
        }
        int res=r[k].c-(mul-tmp);
        if(res)
        {
            v[++cnt]=res*r[k].h;
            l[cnt]=r[k].a;
    //        printf("v=%d l=%d cnt=%d
    ",v[cnt],l[cnt],cnt);
        }
    }
    bool cmp(Node a,Node b){return a.a<b.a;}
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d%d%d",&r[i].h,&r[i].a,&r[i].c),mx+=r[i].c*r[i].h;
        sort(r+1,r+n+1,cmp);
        for(int i=1;i<=n;i++)
            fen(i);
        d[0]=1;
        for(int i=1;i<=cnt;i++)
            for(int j=l[i];j>=v[i];j--)
                if(!d[j]&&j<=l[i])
                {
    //                printf("j=%d v[i]=%d ",j,v[i]);
                    d[j]|=d[j-v[i]];
    //                printf("d[j]=%d
    ",d[j]);
                }
        for(int i=mx;i>=0;i--)
            if(d[i])
            {
                printf("%d",i);
                return 0;
            }
    }
  • 相关阅读:
    centos6 下erlang安装
    待研究
    关键字拦截查询
    获取CNVD的cookie
    adb pull 文件夹到电脑
    Linux中查看端口占用情况
    Running Tensorflow on AMD GPU
    验证码识别相关文章
    conda和pip相关操作
    windows安装pycrypto报错
  • 原文地址:https://www.cnblogs.com/Narh/p/8654464.html
Copyright © 2011-2022 走看看