zoukankan      html  css  js  c++  java
  • 洛谷 1156 垃圾陷阱

    上题

    题目意思很明确,接下来就是考虑这题怎么做了

    明显的一道dp题目

    而且有很明显的背包的元素,则我们可以考虑dp方程

    dp[i]表示在i高度所拥有的生命值

    从h~0开始循环

    如果这个高度的生命值不小于这个垃圾丢下来的时间

    如果 高度+这个垃圾的高度>=d,就输出这个垃圾丢下来的时间

    不然 当前高度+当前垃圾的高度的生命值=max(h~0的生命值),即不吃垃圾用它来堆,此时高度+=这个垃圾的高度

    这个高度的生命值+=吃这个垃圾增长的生命值,即吃垃圾,此时高度不变

    最后输出高度为0的生命值,即出不去存活的最长时间

    看看代码应该就好理解了

     1 #include <cstdio>
     2 #include <cstdlib>
     3 #include <iostream>
     4 #include <algorithm>
     5 #include <cstring>
     6 #include <cmath>
     7 using namespace std;
     8 struct node
     9 {
    10     int t,f,h;
    11 }d[200];
    12 int dp[200],n,h;
    13 bool cmp(node a,node b)
    14 {
    15     return a.t<b.t;
    16 }
    17 int main()
    18 {
    19     scanf("%d %d",&h,&n);
    20     for(int i=1;i<=n;i++)
    21     {
    22         scanf("%d %d %d",&d[i].t,&d[i].f,&d[i].h);
    23     }
    24     sort(d+1,d+n+1,cmp);
    25     memset(dp,0,sizeof(dp));
    26     dp[0]=10;
    27     for(int i=1;i<=n;i++)
    28     {
    29         for(int j=h;j>=0;j--)
    30         {
    31             if(dp[j]-d[i].t>=0)
    32             {
    33                 if(j+d[i].h>=h)
    34                 {
    35                     printf("%d
    ",d[i].t);
    36                     return 0;
    37                 }
    38                 dp[j+d[i].h]=max(dp[j+d[i].h],dp[j]);
    39                 dp[j]+=d[i].f;
    40             }
    41         }
    42     }
    43     printf("%d
    ",dp[0]);
    44     return 0;
    45 }
  • 相关阅读:
    3_数据类型
    2_十进制与二进制的互相转换
    1_初识Java
    Jedis 常用API
    Eazfuscator.net 2020 IL级指令虚拟化保护(Virtualization)机制分析
    C#实现——十大排序算法之选择排序
    Flutter 开发从 0 到 1(三)布局与 ListView
    使用 .NET 进行游戏开发
    Metasploit简单使用——后渗透阶段
    ElasticSearch 索引 VS MySQL 索引
  • 原文地址:https://www.cnblogs.com/wzrdl/p/9785866.html
Copyright © 2011-2022 走看看