• D


    The cows are going to space! They plan to achieve orbit by building a sort of space elevator: a giant tower of blocks. They have K (1 <= K <= 400) different types of blocks with which to build the tower. Each block of type i has height h_i (1 <= h_i <= 100) and is available in quantity c_i (1 <= c_i <= 10). Due to possible damage caused by cosmic rays, no part of a block of type i can exceed a maximum altitude a_i (1 <= a_i <= 40000). 

    Help the cows build the tallest space elevator possible by stacking blocks on top of each other according to the rules.

    Input

    * Line 1: A single integer, K 

    * Lines 2..K+1: Each line contains three space-separated integers: h_i, a_i, and c_i. Line i+1 describes block type i.

    Output

    * Line 1: A single integer H, the maximum height of a tower that can be built

    Sample Input

    3
    7 40 3
    5 23 8
    2 52 6

    Sample Output

    48

    Hint

    OUTPUT DETAILS: 

    From the bottom: 3 blocks of type 2, below 3 of type 1, below 6 of type 3. Stacking 4 blocks of type 2 and 3 of type 1 is not legal, since the top of the last type 1 block would exceed height 40.
    代码:
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    #include<stack>
    #include<map>
    #include<set>
    #include<vector>
    #include<cmath>
    
    const int maxn=4e4+5;
    typedef long long ll;
    using namespace std;
    struct node
    {
        int h,a,c;
    }p[maxn];
    int dp[maxn];
    bool cmp(node x,node y)
    {
        return x.a<y.a;
    }
    int main()
    {
        int K;
        cin>>K;
        for(int t=1;t<=K;t++)
        {
           scanf("%d%d%d",&p[t].h,&p[t].a,&p[t].c);
        } 
        sort(p+1,p+K+1,cmp);
        for(int t=1;t<=K;t++)
        {
            for(int j=1;j<=p[t].c;j++)
            {
                for(int k=p[t].a;k>=p[t].h;k--)
                {
                    dp[k]=max(dp[k],dp[k-p[t].h]+p[t].h);
                }
            }
        }
        int ans=0;
        for(int t=0;t<=p[K].a;t++)
        {
            ans=max(ans,dp[t]);
        }
        printf("%d
    ",ans);
    
        return 0;
    }
  • 相关阅读:
    JAVA多线程实现和应用总结
    大话程序猿眼里的高并发
    重写Dijkstra
    再做一遍floyed
    优美的二分模型
    ACwing : 798. 差分矩阵
    ACwing_789. 数的范围
    快速排序超级强的模板
    1829:【02NOIP提高组】自由落体
    【02NOIP提高组】均分纸牌
  • 原文地址:https://www.cnblogs.com/Staceyacm/p/10821676.html
Copyright © 2020-2023  润新知