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

POJ 2392 Space Elevator

时间:2015-10-16 23:16:34      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:

显然塔的总高度不会超过最大的a[i],而a[i]之前的可以到达的高度

是由a值更小的块组成,所以按照a从小到大的顺序去转移。

然后就是多重背包判断存在性了,几乎和coin那题一样。

数据没coin丧病,倍增可过,单调队列也可,不过还是优化定义最好写。

一开始我把a的范围多看了一个0。。。

#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<queue>
#include<vector>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<algorithm>
//#include<bits/stdc++.h>
using namespace std;

const int maxk = 401, maxh = 4e4+5;
struct Block
{
    int h, a, c;
    bool operator <(const Block& th) const{
        return a < th.a;
    }
    void IN(){ scanf("%d%d%d",&h,&a,&c); }
}B[maxk];

int f[maxh];

//#define LOCAL
int main()
{
#ifdef LOCAL
    freopen("in.txt","r",stdin);
#endif
    int k;
    scanf("%d",&k);
    for(int i = k; i--;) B[i].IN();
    sort(B,B+k);
    int ans = 0;
    memset(f+1,-1,sizeof(int)*B[k-1].a);
    for(int i = 0; i < k; i++){
        for(int j = 0; j <= B[i].a; j++){
            if(~f[j]) f[j] = B[i].c;
            else if(j>=B[i].h && f[j-B[i].h] > 0){
                f[j] = f[j-B[i].h] - 1;
                ans = max(j,ans);
            }else f[j] = -1;
        }
    }
    printf("%d\n",ans);
    return 0;
}

 

POJ 2392 Space Elevator

标签:

原文地址:http://www.cnblogs.com/jerryRey/p/4886599.html

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