• POJ 2392 Space Elevator(多重背包,排序)


    POJ 2392 Space Elevator

    题目传送门

    题意:

    你需要建一个高塔,材料总共有K种,每种材料有三个属性:高度,数量,限度。限度是指该种材料只能在低于该限度的高度下被使用。问你最高能够把这个高塔建到多高。

    解题过程:

    这题中材料有高度和数量,比较容易的想到这题是一道多重背包的题目,但是这题有一个限度的限制,使得一些材料在一定高度以上就不能使用,所以我们可以对材料按限度排序,然后就是朴素的多重背包加上一些非法方案的去除就行了。

    AC代码:

    #pragma GCC optimize (3)
    #include <cstdio>
    #include <cmath>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    #include <set>
    #include <map>
    #include <list>
    #include <vector>
    #include <cstdlib>
    #include <cstring>
    using namespace std;
    const int maxn=500;
    
    int n;
    struct mat {
        int h,a,c;
    }m[maxn];
    bool f[50005];
    
    bool cmp(mat x,mat y) {
        return x.a<y.a;
    }
    
    int main() {
        scanf("%d",&n);
        int ttop=-1;
        for(int i=1;i<=n;i++) {
        scanf("%d%d%d",&m[i].h,&m[i].a,&m[i].c);
        ttop=max(ttop,m[i].a);
        }
        sort(m+1,m+1+n,cmp);
        f[0]=1;
        for(int i=1;i<=n;i++) {
        int top=m[i].a;
        for(int j=top;j>=0;j--) {
            if(!f[j])continue;
            for(int k=1;k<=m[i].c;k++) {
            int t=j+k*m[i].h;
            if(t<=m[i].a)f[t]=1;
            }
        }
        }
        for(int i=ttop;i>=0;i--) {
        if(f[i]) {
            printf("%d
    ",i);
            return 0;
        }
        }
    }

    本人蒟蒻OIer一枚,欢迎加QQ:840776708一起学习蛤。

    「我不敢下苦功琢磨自己,怕终于知道自己并非珠玉;然而心中既存着一丝希冀,便又不肯甘心与瓦砾为伍。」
  • 相关阅读:
    Visual GC(监控垃圾回收器)
    垃圾收集(GC)中如何确定哪些内存是"垃圾
    Java for循环和foreach循环的性能比较
    <mvc:annotation-driven />做了什么
    聊一聊分布式锁的设计
    String类对象的比较
    Java 中 Comparable 和 Comparator 比较
    系统对接API调用
    深入理解Java中的组合和继承
    面向对象设计七大原则
  • 原文地址:https://www.cnblogs.com/Apocrypha/p/9433664.html
Copyright © 2020-2023  润新知