题目链接

题目

题目描述

小明是个大厨,早上起来他开始一天的工作。他所在的餐厅每天早上都会买好 \(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菜先做更好,交换后其他菜的贡献不变,因此可以有如下邻项交换证明:

\[\begin{aligned}
\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 美味菜肴的更多相关文章

  1. 身为一个小白,看到一篇值得看的文章。讲述小白学习python的6个方法。

    01. Python怎么学?   Python虽然号称非常简单,功能强大!但是再简单,它也是一门编程语言,任何一个编程语言都会包含: 内功,心法和招式,内功心法就是指的算法,数据结构: 招式就是任何一 ...

  2. bzoj4571: [Scoi2016]美味

    4571: [Scoi2016]美味 Time Limit: 30 Sec Memory Limit: 256 MB Submit: 275 Solved: 141 [Submit][Status][ ...

  3. BZOJ-4010 菜肴制作 贪心+堆+(拓扑图拓扑序)

    无意做到...char哥还中途强势插入干我...然后据他所言,看了一会题,一转头,我爆了正解....可怕 4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec Memory L ...

  4. BZOJ4010: [HNOI2015]菜肴制作

    Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予 1到N的顺序编号,预估质量最高的菜肴编号 ...

  5. 【BZOJ】【4010】【HNOI2015】菜肴制作

    拓扑排序 这题是要求N个点的一个拓扑序,且满足以下条件:编号1的位置尽可能靠前,在此基础上编号2的位置尽可能靠前…… 我看到这题的第一感觉:将拓扑排序用的队列改为优先队列,编号越小越早出来. 但是连样 ...

  6. bzoj 4010: [HNOI2015]菜肴制作 拓扑排序

    题目链接: 题目 4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec Memory Limit: 512 MB 问题描述 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴 ...

  7. Python天天美味(15) - Python正则表达式操作指南(re使用)(转)

    http://www.cnblogs.com/coderzh/archive/2008/05/06/1185755.html 简介 Python 自1.5版本起增加了re 模块,它提供 Perl 风格 ...

  8. BZOJ 4010 菜肴制作

    Description 知名美食家小A被邀请至ATM 大酒店,为其品评菜肴. ATM酒店为小A准备了\(N\)道菜肴,酒店按照为菜肴预估的质量从高到低给予\(1\)到\(N\)的顺序编号,预估质量最高 ...

  9. 永久存储:腌制一缸美味的泡菜 - 零基础入门学习Python031

    永久存储:腌制一缸美味的泡菜 让编程改变世界 Change the world by program 从一个文件里读取字符串非常简单,但如果想要读取出数值,那就需要多费点儿周折.因为无论是read() ...

  10. BZOJ 4010: [HNOI2015]菜肴制作( 贪心 )

    把图反向,然后按拓扑序贪心地从大到小选, 最后输出.set比priority_queue慢... --------------------------------------------------- ...

随机推荐

  1. 图的遍历(DFS和BFS)

    声明:图片及内容基于https://www.bilibili.com/video/BV1rp4y1Q72r?from=articleDetail 图的遍历 深度优先遍历(DFS) DFS核心是递归和栈 ...

  2. Nacos源码 (7) Nacos与Spring

    SpringCloud工程可以使用Nacos作为注册中心和配置中心,配置和使用非常简单,本文将简单介绍使用方式,并分析其实现方式. SpringCloud工程集成Nacos SpringCloud工程 ...

  3. [转帖]GB18030 编码

    https://www.qqxiuzi.cn/zh/hanzi-gb18030-bianma.php GB18030编码采用单字节.双字节.四字节分段编码方案,具体码位见下文.GB18030向下兼容G ...

  4. [转帖]How to Resolve ORA-3136 Inbound Connection Timed Out

    https://logic.edchen.org/how-to-resolve-ora-3136-inbound-connection-timed-out/#:~:text=ORA-03136%3A% ...

  5. [转帖]1. awk基础,awk介绍,awk基本语法,直接使用action,打印列,初识列和行,\$0、\$NF、NF,基础示例,begin模式,end模式

    文章目录 前言 awk介绍 awk基本语法 直接使用action 打印列 初识列和行 \$0.\$NF.NF 基础示例 初识模式(begin end) 总结 友情链接 前言 本小节是awk基础入门课程 ...

  6. megacli_sw服务器Raid卡的设置过程

    megacli_sw服务器的设置过程 背景 采购的申威服务器有四块硬盘, 第一台服务器在sdd上面安装了一个银河麒麟v10的系统 sda,sdb,sdc 三块硬盘没有进行raid设置, 直接还是用的J ...

  7. [转帖]linux块I/O总体概括

    直接先上重点,linux中IO栈的完全图如下: 系统中能够随机访问固定大小数据片的硬件设备称作块设备.固定大小的数据片称为块.常见的块设备就是硬盘了.不能随机访问的就是字符设备了,管理块设备比字符设备 ...

  8. acme.sh的简单学习过程

    acme.sh的简单学习过程 背景 公司内部测试环境为了节约费用(不要学我) 自己花十块到一百块之前从腾讯云购买一个域名 然后使用NDSPOD进行解析内网IP地址 偶尔需要申请临时证书进行HTTPS的 ...

  9. vue3.2中setup语法糖父组件如何调用子组件中的方法

    父组件如何调用子组件中的方法 父组件.vue <template> <div> <aa ref="testRef"></aa> &l ...

  10. 【验证码逆向专栏】某度滑块、点选、旋转验证码 v1、v2 逆向分析

    声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容.敏感网址.数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 本文章未经许 ...