题目大意

一共有 nnn 件食材,每件食材有三个属性,aia_iaibib_ibicic_ici,如果在 ttt 时刻完成第 iii 样食材则得到 ai−t×bia_i-t\times b_iait×bi 的美味指数,用第 iii 件食材做饭要花去 cic_ici 的时间。
需要设计烹调方案使得在TTT的时间内美味指数最大并输出。

数据范围及约定

  • 对于 40%40\%40% 的数据 1≤n≤101 \le n \le 101n10
  • 对于 100%100\%100% 的数据 1≤n≤501 \le n \le 501n50

所有数字均小于 10510^5105

暴力想法

首先我们可以观察到,若不考虑烹饪顺序,或是已知顺序的情况下,求解是很简单的:只需要使用复杂度O(n^2)的01背包进行dp即可

(如果不知道01背包,强烈建议跳转主页学习)

注意到前40%数据的N很小,我们便可以直接暴力枚举菜品的全排列,进行dp即可。

想明白后,我们稍加计算,就会发现:

超时辣!

时间复杂度O(n22n)O(n^22^n)O(n22n)过不了哒!(理论上超3e8次运算,数据很水就当我没说)

正解

其实刚刚的想法已经比较接近正解了。我们来看看上面的做法能怎么优化。

对于后半部分,可以基本确定是没有优化空间的——首先dp是必做,其次就算能将dp优化到O(nlogn)O(nlogn)O(nlogn)甚至O(n)O(n)O(n),大数据依旧是过不了的。

于是我们考虑如何排列烹饪顺序

首先可以观察到一个性质:如果交换相邻两个菜品的烹饪顺序,对前后菜品产生的贡献是没有影响的,因为交换后此前烹饪的总时间不变!

也就是说,如果存在菜品A优于B(即先烹饪A价值更大)、B优于C,则一定有A优于C!

接下来我们开始推理每种菜品的应有顺序。

假设有两个相邻的菜品序号为 i,ji,ji,j ,之前所用的总时间为TTT

根据题意可得,若先烹饪iii号菜品,得到的价值一共是:

w1=(ai−bi×(T+ci))+(aj−bj×(T+ci+cj))w_1=(a_i-b_i×(T+c_i))+(a_j-b_j×(T+c_i+c_j))w1=(aibi×(T+ci))+(ajbj×(T+ci+cj))
=ai+aj−T×(bi+bj)−bi×ci−bj×ci−bj×cj=a_i+a_j-T×(b_i+b_j)-b_i×c_i-b_j×c_i-b_j×c_j=ai+ajT×(bi+bj)bi×cibj×cibj×cj

若先烹饪jjj号菜品,得到的价值一共是:

w2=(aj−bj×(T+cj))+(ai−bi×(T+cj+ci))w_2=(a_j-b_j×(T+c_j))+(a_i-b_i×(T+c_j+c_i))w2=(ajbj×(T+cj))+(aibi×(T+cj+ci))
=ai+aj−T×(bi+bj)−bi×ci−bi×cj−bj×cj=a_i+a_j-T×(b_i+b_j)-b_i×c_i-b_i×c_j-b_j×c_j=ai+ajT×(bi+bj)bi×cibi×cjbj×cj

显然,若先烹饪iii号更优,则有w1>w2w_1>w_2w1>w2

带入并化简两边,可以得到 −bj×ci>−bi×ci-b_j×c_i>-b_i×c_ibj×ci>bi×ci

即:若bj×ci<bi×cjb_j×c_i<b_i×c_jbj×ci<bi×cj,则先烹饪iii号菜品更优。

所以,我们可以先根据上述结论对数组排序,再做dp

时间复杂度O(nT)O(nT)O(nT)(毕竟nnn很小,排序时间可以不计)

AC代码

#include<bits/stdc++.h>
using namespace std;
#define For(i, j, k) for(int i = j; i <= k; i++)
#define dFor(i, j, k)for(int i = j; i >= k; i--)
#define MaxN 55
#define int long longstruct Node{int a, b, c;bool operator<(const Node x) const{		//重载运算符,按之前的结论排序return c * x.b < b * x.c;}
}a[MaxN];
int T, n;
int f[MaxN][100005];signed main()
{cin >> T >> n;For(i, 1, n) cin >> a[i].a;For(i, 1, n) cin >> a[i].b;For(i, 1, n) cin >> a[i].c;sort(a+1, a+n+1);int ans = 0;For(i, 1, n){For(j, 1, T){				//01背包,虽然没有降维优化awaf[i][j] = max(f[i][j], f[i-1][j]);if(j >= a[i].c){f[i][j] = max(f[i][j], f[i-1][j-a[i].c] + a[i].a-a[i].b*j);}ans = max(ans, f[i][j]);}}cout << ans << endl;return 0;
}

总结

思维难度相对较高,主要在于推理传递性和排序规则

类似的题目还有P1060国王游戏等,可以练习

最后,制作实在不易。如果你喜欢这篇文章,可以点个免费的关注和免费的赞

我们下期再见!

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue svg实现一个环形进度条组件

svg实现一个环形进度条设计初衷&#xff1a;本来想直接使用element的进度条组件的&#xff0c;但是好多属性都没有办法控制。 UI设计的图如下&#xff0c;需要控制未完成和已完成的颜色&#xff0c;端点的形状改为普通的butt 所以使用svg实现了一个环形进度条组件element组件设…

02 51单片机之LED闪烁

文章目录1、单片机1-1、简介1-2、应用场景2、51单片机2-1、背景2-2、主要品牌及其产品2-3、基本组成2-4、命名规则3、单片机内部结构3-1、单片机内部结构图3-2、单片机内部结构3-3、单片机内部管脚图3-4、单片机最小系统3-5、开发板介绍4、点亮LED4-1、新建工程4-1-1、创建工程…

Typecho博客集成算术验证码防御垃圾评论实战指南

文章目录 Typecho实现算术验证码防御机器人垃圾评论的完整方案 背景与问题分析 技术方案设计 系统架构 技术选型 核心实现步骤 1. 创建验证码生成函数 2. 修改评论表单模板 3. 添加AJAX刷新功能 4. 创建验证码刷新接口 5. 添加评论提交验证 安全增强措施 1. 防止暴力破解 2. 增…

clonezilla 导出自动化恢复iso

clonezilla 下载及U盘工具下载 clonezilla rufus U盘写入工具ventoy U盘工具downloaddownloaddownload clonezilla 备份&#xff0c;连贯上一篇文章参考 Choose Clonezilla live (VGA 800x600) Wait for it to complete Language selection Keyboard Settings Select Mode …

深度学习模型开发部署全流程:以YOLOv11目标检测任务为例

深度学习模型开发部署全流程&#xff1a;以YOLOv11目标检测任务为例 深度学习模型从开发到部署的完整流程包含需求分析、数据准备、模型训练、模型优化、模型测试和部署运行六大核心环节。YOLOv11作为新一代目标检测模型&#xff0c;不仅延续了YOLO系列的高效实时性能&#xff…

单片机(STM32-串口通信)

一、串口通信基础概念串口通信&#xff08;Serial Communication&#xff09;是一种在计算机和外部设备之间进行数据传输的通信方式。它通过串行方式逐位传输数据&#xff0c;是最基本和常用的通信接口之一。主要特点1. 串行传输(1)数据按位顺序传输&#xff0c;一次只能传输一…

Redis学习其三(订阅发布,主从复制,哨兵模式)

文章目录9.Redis订阅与发布9.1发布订阅命令9.2示例10.Redis主从复制10.1概念10.2环境配置10.3集群搭建&#xff08;一主二从配置&#xff09;10.4使用规则&原理11.哨兵模式11.1基本概念11.2工作原理11.3使用案例12.缓存穿透,雪崩&#xff08;待拓展&#xff09;12.1缓存穿透…

跨平台 App 如何无痛迁移到鸿蒙系统?全流程实战+Demo 教程

摘要 目前&#xff0c;随着 HarmonyOS&#xff08;鸿蒙系统&#xff09;的快速发展&#xff0c;越来越多开发者和企业希望将已有的 Android、Flutter、React Native 等跨平台应用迁移到鸿蒙生态中。鸿蒙不仅具备分布式能力、原生性能和统一的开发范式&#xff0c;还提供了丰富的…

智慧后厨检测算法构建智能厨房防护网

智慧后厨检测&#xff1a;构建安全洁净厨房的智能解决方案背景&#xff1a;传统后厨管理的痛点与智慧化需求餐饮行业后厨管理长期面临操作规范难落实、安全隐患难察觉、卫生状况难追溯等痛点。传统人工巡检效率低、覆盖面有限&#xff0c;难以实现24小时无死角监管。例如&#…

LatentSync: 一键自动生成对嘴型的视频

LatentSync是什么 字节跳动与北京交通大学联合推出了全新的唇形同步框架 LatentSync&#xff0c;它基于音频驱动的潜在扩散模型&#xff0c;跳过了传统的3D建模或2D特征点提取&#xff0c;直接生成自然逼真的说话视频。 LatentSync借助Stable Diffusion强大的图像生成能力&am…

在断网情况下,网线直接连接 Windows 笔记本和 Ubuntu 服务器进行数据传输

在断网情况下&#xff0c;通过网线直接连接 Windows 笔记本 和 Ubuntu 服务器上的容器 进行数据传输&#xff0c;可以按照以下步骤操作&#xff1a;1. 物理连接 使用网线直连&#xff1a;用一根 普通网线&#xff08;直通线&#xff09; 连接 Windows 笔记本和 Ubuntu 服务器的…

机器学习17-Mamba

深度学习之 Mamba 学习笔记 一、Mamba 的背景与意义 在深度学习领域&#xff0c;序列建模是一项核心任务&#xff0c;像自然语言处理、语音识别和视频分析等领域&#xff0c;都要求模型能有效捕捉长序列里的依赖关系。之前&#xff0c;Transformer 凭借强大的注意力机制成为序列…

Java实现word、pdf转html保留格式

一、word转html 依赖&#xff1a; <properties><poi.version>5.2.3</poi.version><xhtml.version>2.0.4</xhtml.version> </properties><!--word转html--> <dependency><groupId>org.apache.poi</groupId><a…

基于51单片机和16X16点阵屏、矩阵按键的小游戏《俄罗斯方块》

目录系列文章目录前言一、效果展示二、原理分析三、各模块代码1、16X16点阵屏&#xff08;MAX7219驱动&#xff09;2、矩阵按键3、定时器0四、主函数总结系列文章目录 前言 《俄罗斯方块》&#xff0c;一款经典的、怀旧的小游戏&#xff0c;单片机入门必写程序。 有两个版本&…

Stable Diffusion Windows本地部署超详细教程(手动+自动+整合包三种方式)

Stable Diffusion Windows 本地部署超详细教程 (手动 自动 整合包三种方式) 一、引言 我们可以通过官方网站 Stability AI&#xff0c;以及 Dream Studio、Replicate、Playground AI 、Baseten 等网站在线体验 Stable Diffusion 的巨大威力。相比于集成在网络平台的 SD 或者…

sqli-labs靶场通关笔记:第29-31关 HTTP参数污染

第29关 HTTP参数污染本关设置了web应用防火墙&#xff08;WAF&#xff09;&#xff0c;利用白名单保护机制来检测和拦截恶意请求。看本关源代码。<?php //including the Mysql connect parameters. include("../sql-connections/sql-connect.php"); //disable er…

Vuex 基本概念

参照官网整理总结vuex语法。 计划日期&#xff1a; Vuex基础部分&#xff1a;2022年2月20日——2022年2月28日 Vuex源码相关实践&#xff1a;待定 Vuex拓展&#xff1a;待定 写完后&#xff0c;会发到仓库地址&#xff1a;待定 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模…

深入理解Linux文件操作:stdin/stdout/stderr与C语言文件函数全解析

目录 一、stdin、stdout 和 stderr 详解 二、文件打开方式 三、C语言文件操作函数详解 1、文件操作概述 2、文件操作函数分类表 1. 文件打开与关闭 2. 字符读写函数 3. 字符串读写函数 4. 格式化读写函数 5. 二进制读写函数 6. 文件定位函数 7. 文件状态与错误检测…

【自用】JavaSE--集合框架(一)--Collection集合体系

概述之前学的ArrayList就是集合的一种&#xff0c;是一种容器&#xff0c;可以往里面存东西&#xff0c;大小可变Collection集合体系Collection的常用方法以后Collection体系的集合都可以用下图的方法注意toArray方法的数组类型是Object&#xff0c;这样就可以接收任意类型的数…

电脑视频常用几种接口

传输信号类型 DP&#xff08;DisplayPort&#xff09;主要用于传输数字视频和音频信号&#xff0c;支持高分辨率和高刷新率。HDMI&#xff08;High-Definition Multimedia Interface&#xff09;同样传输数字音视频信号&#xff0c;但更偏向消费电子领域&#xff0c;如电视、游…