GREEN垃圾陷阱WELL

2024-02-04 09:58
文章标签 陷阱 垃圾 green well

本文主要是介绍GREEN垃圾陷阱WELL,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

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

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

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

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

样例输入
20 4
5 4 9
9 3 2
12 6 10
13 1 1
样例输出
13

这道题很容易想到背包,但是具体如何设定还是没想出来。在看了luogu一篇博客后豁然开朗

设dp[i][j]表示前i个垃圾(注意一定要先按垃圾出现时间排序好),到达高度j时所拥有的最长的生命时间。

那么dp[i][j]=max(dp[i][j],dp[i-1][j]+a[i].v-(a[i].t-a[i-1].t))(吃,不填)

dp[i][j]=max(dp[i][j],dp[i-1][j-a[i].h]-(a[i].t-a[i-1].t))(不吃,填)

如果有一个dp[i][j]>=0且j+a[i].h>=D,那么就走出去了,
不然就是在dp[i][0]+a[i].t中取个最大值就好了。
搞一个滚动数组优化一下空间

上代码`

#include<bits/stdc++.h>
using namespace std;
const int inf=1e7;
inline int read()
{int data=0;int w=1; char ch=0;ch=getchar();while(ch!='-' && (ch<'0' || ch>'9')) ch=getchar();if(ch=='-') w=-1,ch=getchar();while(ch>='0' && ch<='9') data=(data<<3)+(data<<1)+ch-'0',ch=getchar();return data*w;
}
const int N=110;
int d,g;
struct node{int t,f,h;}a[N];
bool cmp(const node &x,const node &y){return x.t<y.t;}
int dp[2][1001];
int main(){d=read();g=read();int res=-inf;for(int i=1;i<=g;i++){a[i].t=read();a[i].f=read();a[i].h=read(); }sort(a+1,a+g+1,cmp);dp[0][0]=10;a[0].t=0;for(int i=1;i<=g;i++){int cur=i&1,pre=cur^1;memset(dp[cur],128,sizeof(dp[cur]));for(int j=d;j>=0;j--){if(dp[pre][j]<a[i].t-a[i-1].t) continue;if(j+a[i].h>=d) {printf("%d",a[i].t);return 0;}dp[cur][j+a[i].h]=max(dp[cur][j+a[i].h],dp[pre][j]-(a[i].t-a[i-1].t));dp[cur][j]=max(dp[cur][j],dp[pre][j]+a[i].f-(a[i].t-a[i-1].t));} res=max(res,dp[cur][0]+a[i].t);}printf("%d",res);return 0;
}

这篇关于GREEN垃圾陷阱WELL的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/677097

相关文章

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

HotSpot虚拟机的经典垃圾收集器

读《深入理解Java虚拟机》第三版笔记。 关系 Serial、ParNew、Parallel Scavenge、Parallel Old、Serial Old(MSC)、Concurrent Mark Sweep (CMS)、Garbage First(G1)收集器。 如图: 1、Serial 和 Serial Old 收集器 2、ParNew 收集器 3、Parallel Sc

浅谈PHP5中垃圾回收算法(Garbage Collection)的演化

前言 PHP是一门托管型语言,在PHP编程中程序员不需要手工处理内存资源的分配与释放(使用C编写PHP或Zend扩展除外),这就意味着PHP本身实现了垃圾回收机制(Garbage Collection)。现在如果去PHP官方网站(php.net)可以看到,目前PHP5的两个分支版本PHP5.2和PHP5.3是分别更新的,这是因为许多项目仍然使用5.2版本的PHP,而5.3版本对5.2并不是完

C++学习笔记----6、内存管理(四)---- 通常的内存陷阱(2)

3、Windows环境下使用Visual C++发现并修复内存渗露         内存渗露很难跟踪是因为你无法很容易地看着内存并且看到什么对象处于使用中,一开始在哪儿分配的内存。然而,是有程序可以为你做到这一点的。内存渗露检测工具有昂贵的专业软件包,也有免费下载的工具。如果你是在Microsoft Visual C++环境下工作,它的排错工具库有内建的对于内存渗露检测的支持。该内存检测默认没有

Java虚拟机垃圾回收的几个关键问题

20151008 GC的几个关键问题,触发条件,触发的机制 主线是数据的移动,从什么位置到什么位置,移动的条件是什么? 1 垃圾收集在什么时候触发? GC都是在带满了的时候触发的,每次触发都是把不会用的不可达的对象空间回收了,留下还在用的对象。 1) MinorGC的触发是伊甸园空间满的时候 2) FullGC的触发是在老年代满的时候 2 垃圾回收的时候做哪些工作? 1) 一个新的对象new出

水面垃圾检测数据集 3000张 水面垃圾 带标注 voc yolo

数据集概述 该数据集包含3000张图像,专注于水面垃圾的检测。数据集已经按照VOC(Visual Object Classes)和YOLO(You Only Look Once)两种格式进行了标注,适用于训练深度学习模型,特别是物体检测模型,用于识别水面上的各种垃圾。 数据集特点 多样性:包含3000张图像,涵盖了多种类型的水面垃圾,确保模型能够识别各种类型的垃圾。双标注格式:提供VO

用异或交换两个整数的陷阱

前面我们谈到了,可用通过异或运算交换两个数,而不需要任何的中间变量。 如下面: void exchange(int &a, int &b) {     a ^= b;     b ^= a;     a ^= b; } 然而,这里面却存在着一个非常隐蔽的陷阱。 通常我们在对数组进行操作的时候,会交换数组中的两个元素,如exchang(&a[i], &b[j]),

基于YOLOv10的垃圾检测系统

基于YOLOv10的垃圾检测系统  (价格90) 包含    ['CardBoard', 'Glass', 'Metal', 'Paper', 'Plastic']     5个类             ['纸板', '玻璃', '金属', '纸张', '塑料'] 通过PYQT构建UI界面,包含图片检测,视频检测,摄像头实时检测。 (该系统可以根据数据训练出的yolov10的权

一文详解go底层原理之垃圾回收

1 前置知识 1.1 三色回收法 三色回收法在gov1.5版本时是主流的gc方式 简单介绍一下流程: 暂停程序执行流程(开启STW)将新创建的对象全部标记为白色从根节点开始遍历,把遍历到的第一层全部改为灰色遍历一次灰色集合,将灰色集合引用对象变为黑色重复上述步骤,知道没有灰色对象清除白色对象结束STW 1.2 STW 上述1.1所说的STW就是指的stop the world,简单的说

C++学习笔记----6、内存管理(四)---- 通常的内存陷阱(1)

使用new/delete/new[]/delete[]处理动态内存以及底层内存操作是非常容易出错的。对于引起内存有关的问题还特别难以定位。每一个内存泄露与错误指针都有其细微差别。没有能够解决内存问题的银弹。我们就来谈一谈一些通常问题以及能够检测和解决的一些工具。 1、少分配了数据空间与越界内存访问         对于C风格的字符串来讲少分配了数据空间是一个常见的问题,当程序员