博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷p1156 垃圾陷阱(蒟蒻手把手教你用01背包把这道题复杂化)
阅读量:5887 次
发布时间:2019-06-19

本文共 2647 字,大约阅读时间需要 8 分钟。

题目描述

卡门――农夫约翰极其珍视的一条Holsteins奶牛――已经落了到“垃圾井”中。“垃圾井”是农夫们扔垃圾的地方,它的深度为D(2<=D<=100)英尺。

卡门想把垃圾堆起来,等到堆得与井同样高时,她就能逃出井外了。另外,卡门可以通过吃一些垃圾来维持自己的生命。

每个垃圾都可以用来吃或堆放,并且堆放垃圾不用花费卡门的时间。

假设卡门预先知道了每个垃圾扔下的时间t(0< t<=1000),以及每个垃圾堆放的高度h(1<=h<=25)和吃进该垃圾能维持生命的时间f(1<=f<=30),要求出卡门最早能逃出井外的时间,假设卡门当前体内有足够持续10小时的能量,如果卡门10小时内没有进食,卡门就将饿死。

输入输出格式

输入格式:

第一行为2个整数,D 和 G (1 <= G <= 100),G为被投入井的垃圾的数量。

第二到第G+1行每行包括3个整数:T (0 < T <= 1000),表示垃圾被投进井中的时间;F (1 <= F <= 30),表示该垃圾能维持卡门生命的时间;和 H (1 <= H <= 25),该垃圾能垫高的高度。

输出格式:

如果卡门可以爬出陷阱,输出一个整表示最早什么时候可以爬出;否则输出卡门最长可以存活多长时间。

输入输出样例

输入样例#1: 
20 45 4 99 3 212 6 1013 1 1
输出样例#1: 
13

看到题发现是两个状态一开始就吓懵了(:3J∠)

第一反应就是01背包取与不取的问题,吃不吃辣鸡和堆不堆辣鸡

当然,生命我所欲也,高度亦我所欲也,二者不可兼得,舍高度而取生命者也,生命和高度只能二选一。

其实也可以很皮的两个都不选(小声bb)**

首先,因为时间是(应该或许大概)随机的啦,所以先按时间排个序(´・ω・`)

int cmp(qwq a,qwq b){    return a.t

数组f[h][t]记录的是状态(当前堆了高度为h的辣鸡,生命能取到t个小时)能否取到。

然后就是炒鸡炒鸡炒鸡重要的动态转移啦 (•ㅂ•)/♥(敲黑板.jpg)

f[0][10]=true;//初状态没有堆的辣鸡,可以活十个小时所以f【0】【10】是取的到的    maxt=10;//maxt记录的是当前时间最大值    for(int i=1;i<=n;++i)//疯狂枚举每一堆辣鸡    {        int st=laji[i].t,sf=laji[i].f,sh=laji[i].h;        maxt+=sf;        for(int j=H+sh;j>=0;--j)//疯狂枚举高度        {            for(int k=maxt+st;k>=0;--k)//疯狂枚举时间,因为是01背包,每个辣鸡的时间和高度都只能取一次所以j,k是递减的ww            {                if(!f[j][k]&&k>=sf+st)//第i堆辣鸡拿来吃了,k>=sf+st判断枚举的这个时间在第i堆辣鸡到来时卡门是否还活着                {                    f[j][k]=f[j][k-sf];                }                if(!f[j][k]&&j>=sh&&k>=st)//第i堆辣鸡堆起来了,同理需判断卡门是否还活着                {                    f[j][k]=f[j-sh][k];                    if(f[j][k])if(j>=H)mint=min(mint,st);//更新爬出去的时候时间最小值                }            }        }    }

然后就输出结果啦~(≖ ‿ ≖)✧

顺带一提最大存活时间不是所有时间和啦,因为所有辣鸡可能还不够吃2333,就会导致卡门爬坑未半而中道崩殂

if(mint!=maxi)//如果被更新过说明卡门爬出去了直接输出时间最小值    {        printf("%d",mint);        return 0;    }    for(int i=maxt;i>=1;--i)//如果没有就输出存活最长时间(心疼卡门1s)    {        if(f[0][i])        {            printf("%d",i);            return 0;        }    }

阿啦这道题很多做法啦,看了dalao们的题解感觉自己的做法超暴力qwq

后排献上超辣鸡的完整代码quq

#include 
#include
#include
#include
#include
#include
#define maxi 0x7fffffffusing namespace std;int H,n,maxt,mint=maxi;bool f[150][2000];struct qwq{ int t; int f; int h;}laji[105];int cmp(qwq a,qwq b){ return a.t
=0;--j) { for(int k=maxt+st;k>=0;--k) { if(!f[j][k]&&k>=sf+st) { f[j][k]=f[j][k-sf]; } if(!f[j][k]&&j>=sh&&k>=st) { f[j][k]=f[j-sh][k]; if(f[j][k])if(j>=H)mint=min(mint,st); } } } } if(mint!=maxi) { printf("%d",mint); return 0; } for(int i=maxt;i>=1;--i) { if(f[0][i]) { printf("%d",i); return 0; } } return 0;}

好啦没p放了,over~

转载于:https://www.cnblogs.com/pumpkin-qwq/p/9551344.html

你可能感兴趣的文章
【d3.js v4基础】过渡transition
查看>>
VUEJS开发规范
查看>>
Android系统的创世之初以及Activity的生命周期
查看>>
人人都会数据采集- Scrapy 爬虫框架入门
查看>>
Android网络编程11之源码解析Retrofit
查看>>
韩国SK电讯宣布成功研发量子中继器
查看>>
TCP - WAIT状态及其对繁忙的服务器的影响
查看>>
安全预警:全球13.5亿的ARRIS有线调制解调器可被远程攻击
查看>>
麦子学院与阿里云战略合作 在线教育领军者技术实力被认可
查看>>
正确看待大数据
查看>>
Facebook通过10亿单词构建有效的神经网络语言模型
查看>>
2016股市投资风向标 大数据说了算
查看>>
发展大数据不能抛弃“小数据”
查看>>
中了WannaCry病毒的电脑几乎都是Win 7
查看>>
学生机房虚拟化(九)系统操作设计思路
查看>>
nginx报错pread() returned only 0 bytes instead of 4091的分析
查看>>
质数因子
查看>>
Spring源码浅析之事务(四)
查看>>
[转载] Live Writer 配置写 CSDN、BlogBus、cnBlogs、163、sina 博客
查看>>
SQL:连表查询
查看>>