zoukankan      html  css  js  c++  java
  • jzoj 高中 1286——太空电梯

    Description

      奶牛们想用K(1<=K<=400)中石块制造一个太空电梯去太空旅行,每种石块有自己的高度h_i(1<=h_i<=100)和数量c_i(1<=c_i<=10),为了避免宇宙射线的干扰,每种石块不能超过最高可以达到的高度a_i(1<=a_i<=40000)。
      帮助奶牛用石块堆积一个最高的太空电梯。

    Input

      第1行:一个整数K
      第2到K+1行:每行3个用空格隔开的整数h_i,a_i,c_i

    Output

      输出一个高度H,表示最大高度。

    Sample Input

    3
    7 40 3
    5 23 8
    2 52 6

    Sample Output

    48


    dp: 设f[j]为是否有高度为j这种情况,有则为1,没有则为0
    开始将每种石块不能超过最高可以达到的高度,从小到大排序
    然后三重循环枚举i,j,k;i枚举第i种石头;j枚举放i种石头的个数;k枚举可能到达的高度
    状态转移方程:f[k]=f[k]|f[k-a[i].h] (‘|’的意思就是遇到两个0才为0,不然都为1)


    代码:

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int maxn=502;
    struct zs{ int mx,c,h;}a[maxn];
    bool f[40233];
    int i,j,n,m,ans,k,nowc,nowh,nowmx;
    int ra,fh;char rx;
    bool cmp(zs a,zs b){return a.mx<b.mx;}
    int main()
    {
        scanf("%d",&n);f[0]=1;
        for(i=1;i<=n;i++) scanf("%d%d%d",&a[i].h,&a[i].mx,&a[i].c),ans=max(ans,a[i].mx);
        sort(a+1,a+1+n,cmp);
        for(i=1;i<=n;i++)
        {
                         nowc=a[i].c;
                         nowh=a[i].h;
                         nowmx=a[i].mx;
                         for(j=1;j<=nowc;j++) for(k=nowmx;k>=nowh;k--)f[k]=f[k]|f[k-nowh];
        }
        while(!f[ans]&&ans)ans--;
        printf("%d
    ",ans);
        return 0;
    }
  • 相关阅读:
    Django Form组件的扩展
    Python TCP与UDP的区别
    Python三次握手和四次挥手
    网络基础之网络协议
    Python 类方法、实例方法、静态方法的使用与及实例
    python深浅拷贝
    2021牛客寒假算法基础集训营1 题解
    01 Trie 专题
    MOTS:多目标跟踪和分割论文翻译
    牛客巅峰赛S2第6场题解
  • 原文地址:https://www.cnblogs.com/Comfortable/p/8412263.html
Copyright © 2011-2022 走看看