NC14704 美味菜肴
题目
题目描述
小明是个大厨,早上起来他开始一天的工作。他所在的餐厅每天早上都会买好 \(n\) 件食材(每种食材的数量可以视为无限),小明从到达餐厅开始就连续工作 \(T\) 时间。每道菜肴的制作需要特定的一种食材以及一段时间,但是食材一旦放久就不新鲜了,菜的美味值会降低。第 \(i\) 道菜肴有三个属性 \(a_i,b_i,c_i\) ,\(a_i\) 是该菜肴的美味值,\(b_i\) 是该菜肴所选食材不新鲜的速率,如果在第 \(t\) 时刻完成第 \(i\) 道菜则美味值为:\(a_i-t*b_i\),完成这道菜需要 \(c_i\) 的时间。小明希望在这 \(T\) 时间内能做出菜肴使得总美味值最大,所以小明求助于你。
输入描述
第1行输入三个整数 \(n,m,T\) ,分别代表食材种类,菜肴种类和工作时间。
第2行输入 \(n\) 个整数 \(b_i\) ,代表第 \(i\) 个食材不新鲜的速率。
接下来的m行,每行输入三个整数 \(j,a_i,c_i\) ,分别代表第 \(i\) 道菜肴需要的食材编号,菜肴的美味值,完成时间。
数据保证:\(0<n,m≤50,0<j≤n\) ,其他值均 \(<10^6\) ,美味值必须通过完整做出菜肴得到,数据保证在规定时间内至少能完整做出1道菜肴。
输出描述
输出一行,一个整数,表示最大总美味值。
示例1
输入
1 1 74
2
1 502 47
输出
408
示例2
输入
2 2 10
2 1
1 100 8
2 50 3
输出
84
备注
最大总美味值可能为负。
题解
知识点:贪心,背包dp。
注意到贡献是会被选择顺序影响,有后效性,不能直接dp。尝试用排序找到最优相对位置消除后效性。假设A菜先做比B菜先做更好,交换后其他菜的贡献不变,因此可以有如下邻项交换证明:
\Sigma w + A_a - A_b\Sigma t + B_a - B_b(\Sigma t + A_c) + \Sigma w' &\leq \Sigma w + B_a - B_b\Sigma t + A_a - A_b(\Sigma t + B_c) + \Sigma w'\\
-A_cB_b &\leq -A_bB_c\\
\frac{A_b}{A_c} &\leq \frac{B_b}{B_c}
\end{aligned}
\]
注意到最终排序结果由自身属性决定,因此可以以此贪心排序消除后效性。
随后就是个普通的01背包,注意至少要做一个菜,因此要初始化负无穷,避免一个菜都不选的情况,因此最后也要遍历区间 \([1,t]\)找最大值。
时间复杂度 \(O(m\log m +mt+n)\)
空间复杂度 \(O(n+m+t)\)
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll b[57];
struct node {
ll a, b, c;
}cai[57];
ll dp[1000007];
int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n, m, t;
cin >> n >> m >> t;
for (int i = 1;i <= n;i++) cin >> b[i];
for (int i = 1;i <= m;i++) cin >> cai[i].b >> cai[i].a >> cai[i].c, cai[i].b = b[cai[i].b];
///由于时间会导致美味度变化,所以做菜顺序有后效性,因此贪心排序为最优顺序
sort(cai + 1, cai + m + 1, [&](node A, node B) {return A.b * B.c >= B.b * A.c;});
memset(dp, -0x3f, sizeof(dp));///因为不能不做,所以不放空气
dp[0] = 0;
for (int i = 1;i <= m;i++) {
for (int j = t;j >= cai[i].c;j--) {///不是完全背包
dp[j] = max(dp[j], dp[j - cai[i].c] + cai[i].a - j * cai[i].b);
}
}
ll ans = -1e18;
for (int i = 1;i <= t;i++) ans = max(ans, dp[i]);///i≠0
cout << ans << '\n';
return 0;
}
NC14704 美味菜肴的更多相关文章
- 身为一个小白,看到一篇值得看的文章。讲述小白学习python的6个方法。
01. Python怎么学? Python虽然号称非常简单,功能强大!但是再简单,它也是一门编程语言,任何一个编程语言都会包含: 内功,心法和招式,内功心法就是指的算法,数据结构: 招式就是任何一 ...
- bzoj4571: [Scoi2016]美味
4571: [Scoi2016]美味 Time Limit: 30 Sec Memory Limit: 256 MB Submit: 275 Solved: 141 [Submit][Status][ ...
- BZOJ-4010 菜肴制作 贪心+堆+(拓扑图拓扑序)
无意做到...char哥还中途强势插入干我...然后据他所言,看了一会题,一转头,我爆了正解....可怕 4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec Memory L ...
- BZOJ4010: [HNOI2015]菜肴制作
Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予 1到N的顺序编号,预估质量最高的菜肴编号 ...
- 【BZOJ】【4010】【HNOI2015】菜肴制作
拓扑排序 这题是要求N个点的一个拓扑序,且满足以下条件:编号1的位置尽可能靠前,在此基础上编号2的位置尽可能靠前…… 我看到这题的第一感觉:将拓扑排序用的队列改为优先队列,编号越小越早出来. 但是连样 ...
- bzoj 4010: [HNOI2015]菜肴制作 拓扑排序
题目链接: 题目 4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec Memory Limit: 512 MB 问题描述 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴 ...
- Python天天美味(15) - Python正则表达式操作指南(re使用)(转)
http://www.cnblogs.com/coderzh/archive/2008/05/06/1185755.html 简介 Python 自1.5版本起增加了re 模块,它提供 Perl 风格 ...
- BZOJ 4010 菜肴制作
Description 知名美食家小A被邀请至ATM 大酒店,为其品评菜肴. ATM酒店为小A准备了\(N\)道菜肴,酒店按照为菜肴预估的质量从高到低给予\(1\)到\(N\)的顺序编号,预估质量最高 ...
- 永久存储:腌制一缸美味的泡菜 - 零基础入门学习Python031
永久存储:腌制一缸美味的泡菜 让编程改变世界 Change the world by program 从一个文件里读取字符串非常简单,但如果想要读取出数值,那就需要多费点儿周折.因为无论是read() ...
- BZOJ 4010: [HNOI2015]菜肴制作( 贪心 )
把图反向,然后按拓扑序贪心地从大到小选, 最后输出.set比priority_queue慢... --------------------------------------------------- ...
随机推荐
- [转帖]mysql8 ALGORITHM=INSTANT 亿级数据秒速增加字段
一.概述 登录后复制 在线DDL之快速增加列(秒级别的),并不会造成业务抖动.该功能自 MySQL 8.0.12 版本引入,是由腾讯游戏DBA团队贡献,此功能只适用于 InnoDB 表.实际上MySQ ...
- [转帖]/dev/random 和 /dev/urandom的一点备忘
https://www.cnblogs.com/ohmygirl/p/random.html 1. 基本介绍 /dev/random和/dev/urandom是Linux系统中提供的随机伪设备,这两 ...
- [转帖]理解 Linux backlog/somaxconn 内核参数
引言 在研究IOTDB的时候,启动服务的时候会有个报警. WARN: the value of net.core.somaxconn (=4096) is too small, please set ...
- [转帖]深入理解mysql-第五章 InnoDB记录存储结构-页结构
前言: 页是InnoDB管理存储空间的基本单位,上一章我们主要分析了页中的主要的构成行的存储结构-行格式,其中简单提了一下页的概念.这章我们详细讲解一下页的存储结构. 一.数据页结构 前边我们简单提了 ...
- [转帖]通过配置优化KingbaseES服务器性能
目录 1. 概述 2. 数据库应用类型 3. 服务器参数 3.1. max_connections 3.2. shared_buffers 3.3. effective_cache_size 3.4. ...
- Linux 查找并且复制部分文件到其他目录的办法(find xargs {})
最近经常需要从某些文件夹查找部分文件,然后复制到其他目录里面进行进一步的处理 shell 脚本一直在不断的学习中, 最近发现之前看文档还是有疏漏. find . -iname "*fi*&q ...
- Nacos集群启动注意事项
简介 Nacos是阿里巴巴开源的一套服务注册发现的应用 使用简单灵活, 是spring Cloud Alibaba的组成部分 现在拆分微服务的部署情况下,极大的需求nacos服务作为支撑 单点情况下存 ...
- CS231N Assignment1 SVM 笔记
svm.ipynb 为SVM实现一个完全矢量化的损失函数 为其解析梯度实现完全矢量化表达式 使用数值梯度检查实现结果 使用验证集调整学习率和正则化 使用 SGD 优化损失函数 可视化最终学习权重 第一 ...
- 01 vue子组件调用父组件中的方法
vue子组件,调用父组件中有三种方法哈!下面我们一起来讲解. 第一种使用 直接在子组件中通过this.$parent.父组件中的方法.来调用父组件的方法 第一种的缺点是不能够传递参数哈.它只能够调用方 ...
- web字体小于12px的解决办法
大家都知道,web端的字体在正常情况下,最小只能够是12px; 但是有些时候,可能需要字体小于12px 那么如何解决这个办法了 可以使用css3的缩放属性scale 如果字体的大小是10px; 那么我 ...