Luogu P6893 [ICPC 2014 WF] Buffed Buffet 题解

news/2025/11/21 16:47:25/文章来源:https://www.cnblogs.com/Tsuukaku/p/19253668

01背包不可以贪心,但是分数背包可以。

分别考虑两种物品然后枚举合并。

对于 D 类食物,令 \(f(i, j)\) 表示前 \(i\) 种菜吃了 \(j\)​ 克时的最大美味值:

\[\begin{aligned} f(i, j) &= \max_{0 \leq k \leq \lfloor \frac{j}{w_i} \rfloor} \left( f(i - 1, j - kw_i) + \sum_{n = 1}^{k}(t_i - (n - 1) \Delta t_i) \right) \\ f(i, j) &= \max_{0 \leq k \leq \lfloor \frac{j}{w_i} \rfloor} \left( f(i - 1, j - kw_i) + kt_i - \frac{\Delta x_i \times k(k - 1)}{2} \right) \end{aligned} \]

注意到 \(i\) 这一维可以压缩掉,处理第 \(i\) 种菜时令 \(g(i)\) 表示前 \(i - 1\) 个物品的结果,算完第 \(i\) 个物品之后更新到 \(f\) 上去就可以。也就是说,对于单个物品 \((w, t, \Delta t)\),转移化简为:

\[f(j) = \max_{0 \leq k \leq \lfloor \frac{j}{w} \rfloor} \left( g(j - kw) + kt - \frac{\Delta t \cdot k(k - 1)}{2} \right) \]

考虑怎么搞掉这个除法下取整,按同余类来分离,将下标按照除以 \(w\) 的余数分类处理。

\(j = j'w + r\),其中 \(0 \leq r \lt w\),则 \(j - kw = (j' - k)w + r\),设 \(i = j' - k\),则有:

\[f(j'w + r) = \max_{0 \leq i \leq j'} \left( g(iw + r) + (j' - i)t - \frac{\Delta t \cdot (j' - i)(j' - i - 1)}{2} \right) \]

展开上面这个式子,重新整理:

\[\begin{aligned} f(j'w + r) &= \max_{i} \left( g(iw + r) + (j' - i)t - \frac{\Delta t}{2}({j'}^2 - 2ij' - j' + i) \right) \\ &= \max_{i} \left( g(iw + r) - it - \frac{\Delta t}{2} i(i + 1) + \Delta t i j' \right) + j't - \frac{\Delta t}{2} j'(j' - 1) \end{aligned} \]

注意到后面抽离出来的东西和 \(i\) 无关,考虑对这个 \(f\) 构造点和斜率,令 \(X(i) = i, Y(i) = g(iw + r) - it - \frac{\Delta t}{2} i(i + 1)\),有:

\[f(j'w + r) = \max_{i} (Y(i) - (-\Delta t j') \times X(i)) + R \]

其中 \(R\) 为无关 \(i\) 常数,这等价于在平面的点 \((X(i), Y(i))\) 中找到使得直线 \(y = kx + b\) 的截距 \(b\) 最大的点,其中斜率 \(k = -\Delta t j'\),由于 \(\Delta t \gt 0\)\(j'\) 递增,\(k\) 递增,单调队列维护凸包。每个决策点 \(i\) 对应点 \((i, Y(i))\),随着 \(j'\) 增大 \(k\) 会负得越来越多越来越陡,最优决策点在凸包上移动。复杂度降到了 \(O(w)\)

考虑对 C 类食品的贪心。每次取当前收益最大的,当两种物品的收益 \(x, y\) 相等时考虑合并得到收益为 \(\frac{1}{\frac{1}{x} + \frac{1}{y}}\),这一部分的复杂度为 \(O(d + w)\)

上面说到的枚举合并指的是枚举划分多少给 C 类剩下的给 B 类。

#include <bits/stdc++.h>using i64 = long long;struct C {int t, dt;
};struct D {int w, t, dt;
};bool inline operator<(const C& a, const C& b) {return a.t > b.t;
}int d, w;
int cc, dc;
std::vector<C> fc;
std::vector<D> fd;namespace Sol1 {int ct, cd, cw, r;std::vector<double> f, g;std::deque<int> q;double x(int p) {return p;}double y(int p) {return g[p * cw + r] - p * ct - 0.5 * cd * p * (p + 1);}double slope(int l, int r) {double lx = x(l), rx = x(r), ly = y(l), ry = y(r);return (ry - ly) / (rx - lx == 0 ? 1e-10 : rx - lx);}void ins(int p) {while (q.size() > 1 && slope(q[q.size() - 2], q.back()) < slope(q[q.size() - 2], p)) q.pop_back();q.push_back(p);}void del(double k) {while (q.size() > 1 && slope(q.front(), q[1]) > k) q.pop_front();}void add(int wi, int t, int dt) {cw = wi, ct = t, cd = dt;for (int i = 1; i <= w; i++) {g[i] = f[i];f[i] = -1e18;}for (r = 0; r < cw; r++) {q.clear();for (int j = 0; j * cw + r <= w; j++) {ins(j);del(-dt * j);int i = q.front();f[j * cw + r] = std::max(f[j * cw + r], g[i * cw + r] + (j - i) * t - 0.5 * (j - i) * (j - i - 1) * dt);}}}void calc() {f.assign(w + 1, -1e18);g.resize(w + 1);for (int i = 1; i <= dc; i++) add(fd[i].w, fd[i].t, fd[i].dt);}
}namespace Sol2 {std::vector<double> f;void calc() {f.resize(w + 1);if (cc == 0) {for (int i = 1; i <= w; i++) f[i] = -1e18;return;}std::sort(fc.begin() + 1, fc.begin() + cc + 1);int p = 1;double cur = fc[1].t, cdt = fc[1].dt, cw = 0, sum = 0;p++;for (int i = 1; i <= w; i++) {while (cw < i) {if (p > cc || cur - cdt * (i - cw) > fc[p].t) {sum += cur * (i - cw) - 0.5 * (i - cw) * (i - cw) * cdt;cur -= cdt * (i - cw), cw = i;} else {double q = (cur - fc[p].t) / cdt;sum += cur * q - 0.5 * q * q * cdt;cur = fc[p].t, cw += q;cdt = 1.0 / (1.0 / cdt + 1.0 / (fc[p].dt != 0 ? fc[p].dt : 1e-10));p++;}}f[i] = sum;}}
}int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cin >> d >> w;fc.resize(d + 1);fd.resize(d + 1);while (d--) {char tp[10];std::cin >> tp;if (tp[0] == 'D') {++dc;std::cin >> fd[dc].w >> fd[dc].t >> fd[dc].dt;} else {++cc;std::cin >> fc[cc].t >> fc[cc].dt;}}Sol1::calc();Sol2::calc();double ans = -1e18;for (int i = 0; i <= w; i++) ans = std::max(ans, Sol2::f[i] + Sol1::f[w - i]);if (cc == 0 && ans < -1e16) std::cout << "impossible\n";else std::cout << std::fixed << std::setprecision(10) << ans << "\n";return 0;
}

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

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

相关文章

苏州一对一辅导机构哪家好?2026实测排行榜,这5家值得重点关注!

苏州家长在挑选一对一家教时,常常被一连串问题困住:“到底哪家机构才算真靠谱?一节课收费多少才在合理范围?怎样选才能避开那些隐形的坑?”——市面上从不缺打着“名校师资”旗号的机构,可教员的真实背景却经不起…

性能优化 | HarmonyOS预加载,三步即可提升APP页面的响应速度

你是否还在为页面响应时间长,资源加载慢苦恼? 通常情况下,面临的选择要么是压缩页面文件,减少图片、文字等静态资源的体积。要么是通过代码调整、设定缓存策略来进一步缩短响应时间。 看起来也许只有短短的几十个字…

CF1437F Emotional Fishermen

这种排列计数题要多分析一下答案的形式。 比如说这个题,答案的形式就是选一些比较大的数,在其中间插入小于前面的 \(\frac{1}{2}\) 的数。 DP 一下即可,重要的是注意到这个形式。

习题解析之:汽车限行

习题解析之:汽车限行【问题描述】 为缓解城市交通压力,武汉市交管局对于长江一桥及江汉一桥实行限行,规定如下:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮…

立贴明志

365天成为大模型技术专家

石墨文档怎么批量导出?我自己手搓了一个 Chrome 插件(附下载)

写在前面 这篇文章不是什么官方通稿,纯粹是作为一个石墨文档的老用户,来聊聊最近遇到的一个大坑,以及我是怎么填上的。 如果你也像我一样,在石墨文档里存了几百上千个文件,想要把它们下载到本地备份,或者迁移到其…

量子力学作业6

第 6 次作业 习题 6.7 (a) 对 \(\psi(x_1-a,x_2-a)\) 在 \((0,0)\) 处进行泰勒展开: \[\psi(x_1-a, x_2-a) = \sum_{n,m} \frac{1}{n!m!}(-a)^{n+m}\frac{d^n}{dx_1^n}\frac{d^m}{dx_2^m}\psi(x_1, x_2) \]\[= \sum…

【LVGL】选项卡部件

引言 选项卡部件(lv_tabview)选项卡部件相关 api 函数 注意: 对于添加选项卡函数lv_tabview_add_tab(),是有一个相当于容器的返回值的,定义一个对象接收此返回值后,就可以将其作为父对象来创建其他部件了。示例程…

python学习-print

任务1 打印数字 print(2025) 任务2 我是mia print(我是mia) #打印非数字信息需要携带单引号或双引号,表示打印的字符串信息 任务3 创建一个变量year,值为2025,打印出变量year year = 2025 print(year)

WSL2调用摄像头并使用OpenCV - 教程

WSL2调用摄像头并使用OpenCV - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco…

unity动态将3d标牌UI加载到模型子物体下,UI变形问题

unity动态将3d标牌UI加载到模型子物体下,UI变形问题//1、直接生成模型GameObject prefab = GameObject.Instantiate(modeinfo, SelectedModel.transform);//2、先生成在世界下,再设置为子物体prefab.transform.SetPa…

2025湛江一对一辅导机构测评榜:从城区到县域的靠谱补习方案全解析

在湛江,从赤坎区世贸大厦周边为小学孩子抓学习习惯的家长,到霞山区鼎盛广场附近焦虑初中孩子成绩滑坡的家庭;从坡头区、麻章区紧盯高中备考冲刺的父母,到遂溪县、徐闻县、廉江市、雷州市、吴川市渴求优质教育资源的…

常州一对一家教机构哪个好?2026权威测评榜单:从师资到提分,5家主流平台深度对比

常州一对一辅导机构哪个好?一对一家教平台怎么选?这是无数常州家长为孩子找辅导时最头疼的问题。宣传页上的 “提分王牌” 老师,可能连苏教版教材和常州中高考考纲都不熟悉;线下机构动辄要求预缴数万元,孩子不适应…

二次验证码介绍及使用

什么是2FA验证码? 概念解析 2FA(Two-Factor Authentication,两步验证)验证码可以理解为学名,俗名也可以叫做:二次验证码,将军令,Google Authenticator(谷歌动态口令) 2FA是一种安全机制,通过要求用户提供两…

2025汕头一对一家教机构口碑排名:从小学到高中,权威测评5家靠谱机构,实用方案覆盖金平龙湖等全区域

“给孩子选汕头一对一辅导机构,比挑学校还费心!”这是汕头金平区家长陈女士的感慨。她的孩子上初三,数学偏科严重,在龙湖区、澄海区试了2家课外补习机构,要么老师照本宣科,要么课后没人跟进,钱花了不少,成绩没…

Veeam Data Platform 13.0 发布 - 数据保护和管理解决方案

Veeam Data Platform 13.0 发布 - 数据保护和管理解决方案Veeam Data Platform 13.0 发布 - 数据保护和管理解决方案 面向混合云和多云的 云端、虚拟和物理环境 备份和恢复 监控和分析 恢复编排 请访问原文链接:https…

2025年7大AI写论文工具推荐|一键生成+文献智能整合,毕业论文查重无忧!

2025年11月校园宿舍里,小李为论文发愁,小张分享了[AI论文及时雨](https://paperrain.cn/?df=cnblogs_ipapers)工具。本文推荐2025年7大AI写论文工具,包括AI论文及时雨、巨鲸写作、ChatGPT等。各工具功能丰富,如AI…

国标GB28181算法算力平台EasyGBS如何为养老院构建全天候安全防线?

国标GB28181算法算力平台EasyGBS如何为养老院构建全天候安全防线?一、方案背景 在老龄化进程不断加快的当下,养老院作为老年人重要的生活场所,其安全与管理面临着诸多挑战。传统监控方式存在画面模糊、信息延迟、管…

江苏省做合同纠纷比较靠谱的律所推荐及选择参考

在经济活动频繁的江苏省,合同作为企业及个人间权利义务约定的重要载体,其纠纷的妥善处理对维护合法权益至关重要。选择一家专业、可靠的律所协助解决合同纠纷,能够有效降低法律风险,提升纠纷解决效率。本文将围绕江…

如何结合langchain、neo4j搭建关联检索问答

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …