AcWing算法提高课-1.3.18能量石

news2024/11/28 2:28:40

宣传一下算法提高课整理 <—

CSDN个人主页:更好的阅读体验 <—

Start

本题链接(AcWing) 点这里

题目描述

岩石怪物杜达生活在魔法森林中,他在午餐时收集了 N N N 块能量石准备开吃。

由于他的嘴很小,所以一次只能吃一块能量石。

能量石很硬,吃完需要花不少时间。

吃完第 i i i 块能量石需要花费的时间为 S i S_i Si 秒。

杜达靠吃能量石来获取能量。

不同的能量石包含的能量可能不同。

此外,能量石会随着时间流逝逐渐失去能量。

i i i 块能量石最初包含 E i E_i Ei 单位的能量,并且每秒将失去 L i L_i Li 单位的能量。

当杜达开始吃一块能量石时,他就会立即获得该能量石所含的全部能量(无论实际吃完该石头需要多少时间)。

能量石中包含的能量最多降低至 0 0 0

请问杜达通过吃能量石可以获得的最大能量是多少?

输入格式

第一行包含整数 T T T,表示共有 T T T 组测试数据。

每组数据第一行包含整数 N N N,表示能量石的数量。

接下来 N N N 行,每行包含三个整数 S i , E i , L i S_i,E_i,L_i Si,Ei,Li

输出格式

每组数据输出一个结果,每个结果占一行。

结果表示为 Case #x: y,其中 x x x 是组别编号(从 1 1 1 开始), y y y 是可以获得的最大能量值。

数据范围

1 ≤ T ≤ 10 1 \le T \le 10 1T10,
1 ≤ N ≤ 100 1 \le N \le 100 1N100,
1 ≤ S i ≤ 100 1 \le S_i \le 100 1Si100,
1 ≤ E i ≤ 1 0 5 1 \le E_i \le 10^5 1Ei105,
0 ≤ L i ≤ 1 0 5 0 \le L_i \le 10^5 0Li105

输入样例:

3
4
20 10 1
5 30 5
100 30 1
5 80 60
3
10 4 1000
10 3 1000
10 8 1000
2
12 300 50
5 200 0

输出样例:

Case #1: 105
Case #2: 8
Case #3: 500

样例解释

在样例#1中,有 N = 4 N = 4 N=4 个宝石。杜达可以选择的一个吃石头顺序是:

  • 吃第四块石头。这需要 5 5 5 秒,并给他 80 80 80 单位的能量。
  • 吃第二块石头。这需要 5 5 5 秒,并给他 5 5 5 单位的能量(第二块石头开始时具有 30 30 30 单位能量, 5 5 5 秒后失去了 25 25 25 单位的能量)。
  • 吃第三块石头。这需要 100 100 100 秒,并给他 20 20 20 单位的能量(第三块石头开始时具有 30 30 30 单位能量, 10 10 10 秒后失去了 10 10 10 单位的能量)。
  • 吃第一块石头。这需要 20 20 20 秒,并给他 0 0 0 单位的能量(第一块石头以 10 10 10 单位能量开始, 110 110 110 秒后已经失去了所有的能量)。

他一共获得了 105 105 105 单位的能量,这是能获得的最大值,所以答案是 105 105 105

在样本案例#2中,有 N = 3 N = 3 N=3 个宝石。

无论杜达选择吃哪块石头,剩下的两个石头的能量都会耗光。

所以他应该吃第三块石头,给他提供 8 8 8 单位的能量。

在样本案例#3中,有 N = 2 N = 2 N=2 个宝石。杜达可以:

  • 吃第一块石头。这需要 12 12 12 秒,并给他 300 300 300 单位的能量。
  • 吃第二块石头。这需要 5 5 5 秒,并给他 200 200 200 单位的能量(第二块石头随着时间的推移不会失去任何能量!)。

所以答案是 500 500 500


思路

本题为DP问题,可以使用 闫氏DP分析法 解题。

对于这种体积和价值变化的背包问题,我们考虑贪心。

对于两个相邻元素 i , j i,j i,j 的排列 ( i , j i,j i,j 获得的能量都不为 0 0 0

− , − , − , i , j , − , − , − -,-,-,i,j,-,-,- ,,,i,j,,,

显然有

E j + E i − S j × L i ≤ E i + E j − S i × L j E_j+E_i-S_j \times L_i \le E_i+E_j-S_i \times L_j Ej+EiSj×LiEi+EjSi×Lj

S j × L i ≥ S i × L j S_j \times L_i \ge S_i \times L_j Sj×LiSi×Lj

所以我们按照这个顺序将原序列排序,即可获得最优解的序列。

DP:
  • 状态表示 f i , j f_{i,j} fi,j
    • 集合:考虑前 i i i 个魔法石,并且在吃掉某个魔法石后,总时间恰好为 j j j 的方案。
    • 属性: max ⁡ \max max
  • 状态计算:
    • 选第 i i i 个魔法石: f i − 1 , j − s i + e i − l i × ( j − s i ) f_{i-1,j-s_i}+e_i-l_i \times (j-s_i) fi1,jsi+eili×(jsi)
    • 不选第 i i i 个魔法石: f i − 1 , j f_{i-1,j} fi1,j

时间复杂度

O ( n × ∑ i = 1 n s i ) O(n \times \sum_{i=1}^n s_i) O(n×i=1nsi)


AC Code:

C + + C++ C++

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 10010;

int n;
struct ES
{
	int s, e, l;
}st[N];
int f[N];

bool cmp(ES a, ES b) // 按s[i] * l[j] < s[j] * l[i]排序
{
	return a.s * b.l < a.l * b.s;
}

int main()
{
	int t;
	cin >> t;
	for (int q = 1; q <= t; q ++ )
	{
	    cin >> n;
		int m = 0;
		for (int i = 0; i < n; i ++ )
		{
			int s, e, l;
			cin >> s >> e >> l;
			st[i] = {s, e, l};
			m += s;
		}
		
		sort(st, st + n, cmp);
		
		memset(f, -0x3f, sizeof f); // 对于“恰好”之类的问题,先把整个初始化成无穷大
		f[0] = 0; // 起点为0
		
		for (int i = 0; i < n; i ++ )
		{
			int s = st[i].s, e = st[i].e, l = st[i].l;
			for (int j = m; j >= s; j -- )
				f[j] = max(f[j], f[j - s] + e - (j - s) * l);	
		}
		
		int res = 0;
		for (int i = 1; i <= m; i ++ )
			res = max(res, f[i]);
		printf("Case #%d: %d\n", q, res); // 注意输出格式
	}
	
	return 0;
}

End

最后,如果觉得对您有帮助的话,点个赞再走吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/858376.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Elasticsearch 与 OpenSearch:揭开性能差距

作者&#xff1a;George Kobar, Ugo Sangiorgi 对于任何依赖快速、准确搜索数据的组织来说&#xff0c;强大、快速且高效的搜索引擎是至关重要的元素。 对于开发人员和架构师来说&#xff0c;选择正确的搜索平台可以极大地影响你的组织提供快速且相关结果的能力。 在我们全面的…

突破笔试:力扣计算布尔二叉树的值(medium)

1.题目链接&#xff1a;2331. 计算布尔二叉树的值 2. 题目描述&#xff1a; 给你一棵 完整二叉树 的根&#xff0c;这棵树有以下特征&#xff1a;叶子节点 要么值为 0 要么值为 1 &#xff0c;其中 0 表示 False &#xff0c;1 表示 True 。 非叶子节点 要么值为 2 要么值为 …

通过Easy Excel导入数据

目录 &#x1f351;一、背景&#x1f351;二、开发验证&#x1f34a;2.1、引入easyexcel依赖&#x1f34a;2.2、创建表及基础代码&#x1f34a;2.3、处理类及接口&#x1f353;2.3.1、EasyExcel监听处理器&#x1f353;2.3.2、Controller接口&#x1f353;2.3.3、service调用监…

Vue3使用wangEditor

那么这一节我们在编辑公司信息的弹窗中使用富文本插件wangEditor官网 Vue3使用wangEditor 安装wangEditor在弹窗中引入wangEditor结构api接口部分editor组件script部分怎么去修改富文本的编辑器&#xff1f; 案例内效果&#xff1a; 安装wangEditor npm install wangeditor/…

bash: make: command not found

make之后报错信息如下&#xff1a;cd 对应的文件路径后 make 发现报错&#xff1a;bash: make: command not found 这个原因可能是没有安装make工具,也可能是安装了make之后,没有将make的文件路径添加到系统环境变量中 有没有安装make,可以使用Search Everything搜索是否有make…

24聊城大学823软件工程考研

1.软件发展有几个阶段&#xff1f;各有何特征&#xff1f; ①程序设计阶段 硬件特征&#xff1a;价格贵、存储容量小、运行可靠性差。 软件特征&#xff1a;只有程序、程序设计概念&#xff0c;不重视程序设计方法。 ②程序系统阶段。 硬件特征&#xff1a;速度、容量及工作可…

JS逆向系列之猿人学爬虫第11题 - app抓取 - so文件协议破解

题目地址 http://match.yuanrenxue.com/match/11这是个app题目,先下载下来安装到测试手机上 安装完成后的app界面长这样 打开之后是这样的: 要求已经简单明了了。 二话不说先反编译app 不出意外的是没出意外,源代码里面没啥混淆,所有东西都展示的明明白白的。 "…

Java转换流

文章目录 转换流的理解**InputStreamReader****OutputStreamWriter**练习 引入情况1&#xff1a; 使用FileReader 读取项目中的文本文件。由于IDEA设置中针对项目设置了UTF-8编码&#xff0c;当读取Windows系统中创建的文本文件时&#xff0c;如果Windows系统默认的是GBK编码&a…

每天一个知识点——Normalization

这里结合大模型的学习&#xff0c;主要分析Layer Norm、RMS Norm和Deep Norm的异同&#xff0c;与此同时&#xff0c;究竟是在之前执行Normalization&#xff08;Pre-Norm&#xff09;还是之后执行&#xff08;Post-Norm&#xff09;&#xff0c;也是一个比较喜欢拿来讨论的知识…

LoRaWAN网关与网络服务器(NS)的通信CUPS 协议介绍

LoRa Basics™ Station 定期查询 CUPS 服务器以获取更新。该协议是 HTTP/REST,使用Credentials中描述的客户端/服务器身份验证方法。对于每个查询,工作站都会提供有关其当前状态的信息,并接收包含其 LNS 和 CUPS 凭证更新的二进制 blob,以及具有任意更新的通用数据段。 通…

AIRIOT搭建低成本、更聪明的智能环卫系统,让管理更加高效智能

环卫工程作为城市基础设施保障&#xff0c;是城市建设管理中不可或缺的重要组成部分。随着城市进程的加快及技术的进步&#xff0c;环卫工程管理也在逐渐向精细化、智能化、绿色化等趋势发展。 智能环卫依托物联网、AI、大数据等技术&#xff0c;对环卫管理所涉及到的人、车、物…

ACM算法竞赛中在编辑器中使用输入输出样例-CPH

通用方法 我们可以在编辑器中创建三个文件&#xff0c;一个是main.cpp,一个是test.in,一个是test.out分别用来写代码&#xff0c;输入输入数据&#xff0c;显示输出数据 这种方法的好处是不需要插件&#xff0c;在任何编辑器中都可以实现&#xff0c;例如Devc,sublime,vscode…

【Unity细节】Unity打包后UI面板消失是怎么回事

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 收录于专栏&#xff1a;unity细节和bug ⭐关于物体的动画碰到其他碰撞器后停止播放的问题⭐ 文章目录 ⭐关于物体的动画碰…

Camunda 7.x 系列【3】Camunda 简介

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Spring Boot 版本 2.7.9 本系列Camunda 版本 7.19.0 源码地址&#xff1a;https://gitee.com/pearl-organization/camunda-study-demo 文章目录 1. 概述2. 核心组件2.1 流程引擎2.2 模型2.3 Web…

无涯教程-Perl - grep函数

描述 此函数从LIST中提取EXPR为TRUE的所有元素。 语法 以下是此函数的简单语法- grep EXPR, LIST返回值 此函数返回在标量context中表达式返回true的次数以及在列表context中与表达式匹配的元素列表。 例 以下是显示其基本用法的示例代码- #!/usr/bin/perllist (1,&qu…

webpack 热更新的实现原理

webpack 的热更新⼜称热替换&#xff08;Hot Module Replacement&#xff09;&#xff0c;缩写为HMR。这个机制可以做到不⽤刷新浏览器⽽将新变更的模块替换掉旧的模块。 原理&#xff1a; ⾸先要知道 server 端和 client 端都做了处理⼯作&#xff1a; 在 webpack 的 watch…

在Cesium中给管道添加水流效果

添加效果前后对比: 关键代码: /*** 水流粒子,目前支持向上或者向下的效果* @param {Number} x* @param {Number} y* @param {Number} z* @param {Number} options* @example* options = {* color: Cesium.Color.AZURE,* emissionRate: 5, //影响水流速度* direc…

Python编程——谈谈函数的定义、调用与传入参数

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 本文专栏&#xff1a;Python专栏 专栏介绍&#xff1a;本专栏为免费专栏&#xff0c;并且会持续更新python基础知识&#xff0c;欢迎各位订阅关注。 目录 一、理解函数 二、函数的定义 1、语法 2、定义一个…

接口测试过程中常见的接口安全性问题,通用测试点整理归纳

我们日常的接口测试工作主要是验证接口的功能性&#xff08;入参、出参、边界值等&#xff09;&#xff0c;在接口测试过程中遇到的一些接口安全性的问题&#xff0c;整理成了通用的测试点&#xff0c;不一定适用于全部的产品&#xff0c;仅做参考。 一、登录接口校验 验证登…

手写SpringCloud系列-负载均衡算法实现

手写SpringCLoud项目地址&#xff0c;求个star github:https://github.com/huangjianguo2000/spring-cloud-lightweight gitee:https://gitee.com/huangjianguo2000/spring-cloud-lightweigh 一&#xff1a;什么是负载均衡 最开始的系统访问量很少&#xff0c;就一个单机就足…