贪心(微扰) + dp

这道题还是比较难的,前置知识:

  1. 贪心的微扰(邻项交换)证法,例题:国王游戏耍杂技的牛
  2. 01背包

算法1:暴力\(O(T * n! * n)\)

可以\(dfs\)全排列枚举所有吃的方案,然后每次线性算能量取最大值即可。

算法2:贪心 + dp \(O(T * n * \sum_{i = 1}^{n}s_i)\)

贪心将问题转化

发现有可能存在最优解的某些宝石的贡献为\(0\),我们剔除了这些宝石。

假设最优解的能量石排列长度为\(k (1 <= k <= n)\) 因为去掉了那些没有贡献的宝石,位置为:

\(a_1, a_2, a_3...a_k\)。

那么对于任意两个位置\(i = a_l, j = a_{l + 1} (1 <= l < k)\)

交换后两个宝石的贡献总和不会变得更大,即(假设之前的总时间为\(t\) ):

\(E_i - t * L_i + E_j - (t + S_i) * L_j >= E_j - t * L_j + E_i - (t + S_j) * L_i\)

整理后:

\(S_i * L_j <= S_j * L_i\)。

我们可以把跟\(i\)有关的放到一边,调整一下:

\(\frac{S_i}{L_i} <= \frac{S_j}{L_j}\)

这样,我们只要以如上条件作为宝石间排序的条件,进行一次\(sort\)。

因为对于其他形式的放置规律,必然可以通过交换满足\(\frac{S_i}{L_i} > \frac{S_j}{L_j}\)的相邻的两项来得到更小值。

那么最优解的坐标(新的坐标)一定满足:

\(a_i < a_2 < a_3 ... < a_k\)

dp

那么,我们只要搞个\(01\)背包,\(S_i\)作为费用,\(max(0, E_i - (t - S_i) * L_i)\) 作为价值 (\(t\)为当前花费时长)。

\(f[t]\) 表示当前正好花\(t\)时间得到的最大能量。

状态转移方程:

\(f[t] = max(f[t], f[t - S_i] + max(0, E_i - (t - S_i) * L_i))\)

由于我们背包放物品(宝石)的顺序是坐标从\(1\)到\(n\)的,所以一定能枚举到最优解。

初始状态:\(f[0] = 0\),其余为负无穷

答案:\(max(f[i]) (1 <= i <= \sum_{i = 1}^{n}s_i)\)

参考代码

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 105, S = 10005;
int n;
int f[S];
struct Node{
int s, e, l;
bool operator < (const Node &x) const{
return s * x.l < x.s * l;
}
}a[N];
int main() {
int T, cnt = 0; scanf("%d", &T);
while(T--) {
memset(f, 0xcf, sizeof f);
scanf("%d", &n);
int t = 0;
for(int i = 1, s, e, l; i <= n; i++) {
scanf("%d%d%d", &s, &e, &l);
t += s; a[i] = (Node) { s, e, l };
}
sort(a + 1, a + 1 + n);
f[0] = 0;
for(int i = 1; i <= n; i++) {
for(int j = t; j >= a[i].s; j--)
f[j] = max(f[j], f[j - a[i].s] + max(0, a[i].e - (j - a[i].s) * a[i].l));
}
int res = 0;
for(int i = 1; i <= t; i++) res = max(res, f[i]);
printf("Case #%d: %d\n", ++cnt, res);
}
return 0;
}

Acwing 734. 能量石的更多相关文章

  1. AcWing 6. 多重背包问题 III

    //f[i,j] 所有只从前i块能量石中选,且总体积恰好为j的方案数 #include <iostream> #include <algorithm> #include < ...

  2. c++制作小游戏--雷电

    用c++实现了一个小游戏--雷电,貌似执行的还不错.贴图和声效也是Duang!Duang!的.整个项目我也会给出下载链接,有兴趣的能够编译执行一下.用到了C++11的新特性,最好是使用vs2013编译 ...

  3. [GDOI2016][树链剖分+主席树]疯狂动物城

    题面 Description Nick 是只在动物城以坑蒙拐骗为生的狐狸,儿时受到偏见的伤害,放弃了自己的理想.他被兔子 Judy 设下圈套,被迫与她合作查案,而卷入意想不到的阴谋,历尽艰险后成为搭档 ...

  4. 2019牛客暑期多校训练营(第七场)F-Energy stones(思维+树状数组)

    >传送门< 题意:有n块能量石,每秒钟会增加Li的能量,但是一旦增长到了Ci它就不会增长了,它初始的能量为Ei. 现在有若干个时刻ti,会选择下标在[Si,Ti]的能量石吸取它们的能量,这 ...

  5. 「Poetize10」能量获取

    描述 Description “封印大典启动,请出Nescafe魂珠!”随着 圣主applepi一声令下,圣剑护法rainbow和魔杖护法freda将Nescafe魂珠放置于封印台上.封印台是一个树形 ...

  6. <转>请戒掉成功学和正能量,那是麻痹人的毒药 | 新知

    非常不幸的是,这将是一场非常糟糕的演说.我不想骗你们,你们从我这里几乎什么也学不到.你们在离开的时候肯定会感到失望,你们的生活并不会得到改善. 更糟糕的是,你还会意识到生活的本质毫无意义,你的一切努力 ...

  7. AE插件:能量激光描边光效特效Saber Mac汉化版

    与大家分享一款非常好用的AE插件Saber插件汉化版.videocopilot saber是一款能量激光描边光效特效AE插件,可以帮助用户制作出能量激光.传送门.霓虹灯.电流.光束.光剑等效果.小编现 ...

  8. 英语chiltonite葡萄石chiltonite单词

    葡萄石Chiltonite 1.葡萄石能够促进血液循环,具有美容养颜的功效,非常适合女性佩戴,可以增加个人魅力,还能加强事业财运,凝聚财富气场. 2.绿色光对应人体心轮,对心脏,肺脏有效用,内涵的磁石 ...

  9. 区间DP小结 及例题分析:P1880 [NOI1995]石子合并,P1063 能量项链

    区间类动态规划 一.基本概念 区间类动态规划是线性动态规划的拓展,它在分阶段划分问题时,与阶段中元素出现的顺序和由前一阶段的那些元素合并而来由很大的关系.例如状态f [ i ][ j ],它表示以已合 ...

随机推荐

  1. tcp ESTABLISHED 接收数据

    tcp_rcv_established函数的工作原理是把数据包的处理分为2类:fast path和slow path,其含义显而易见.这样分类的目的当然是加快数据包的处理,因为在正常情况下,数据包是按 ...

  2. rgw前端替换civetweb为beast

    前言 ceph的rgw现在提供了两种前端, civetweb和beast 配置 修改配置文件 rgw_frontends = civetweb port=7481 为 rgw frontends = ...

  3. 算法:Common Subsequence(动态规划 Java 最长子序列)

    Description A subsequence of a given sequence is the given sequence with some elements (possible non ...

  4. CSS @property - 实验性

  5. HDU100题简要题解(2000~2009)

    前言(废话): 从11月6号到11月20号,断断续续做了有三个星期,总算整完了,之后会慢慢整理汇总到这里 中间部分用到数学知识的十几道题边学边做直接把我这个数学菜鸟做到怀疑人生 11.6~11.10又 ...

  6. [原题复现+审计][ZJCTF 2019] WEB NiZhuanSiWei(反序列化、PHP伪协议、数组绕过)

    简介  原题复现:https://github.com/CTFTraining/zjctf_2019_final_web_nizhuansiwei/  考察知识点:反序列化.PHP伪协议.数组绕过   ...

  7. 总是说spring难学?来看完这些spring的注解及其解释,真香!

    前言 用过spring的人都知道,spring简单的通过注解就可以完成很多事情,但这些东西是如何实现的呢以及如何应用到我们自己的代码中?接下来,让我们一起开启注解的旅程. 1. @Controller ...

  8. 花了三天整理,Spring Cloud微服务如何设计异常处理机制?还看不懂算我输

    前言 首先说一下为什么发这篇文章,是这样的.之前和粉丝聊天的时候有聊到在采用Spring Cloud进行微服务架构设计时,微服务之间调用时异常处理机制应该如何设计的问题.我们知道在进行微服务架构设计时 ...

  9. FL Studio乐理教程之和弦进行

    和弦级数 在一个调内,分别由调内7个音为根音组成的和弦总共有7个,每个和弦依次为1-7级和弦.例如在C大调内,以C为根音建立和弦,就是一级和弦,以D为根音建立和弦,即是二级和弦,以此类推. 图1:1- ...

  10. python+selenium利用cookie记住密码

    先上代码 1 from selenium import webdriver 2 from time import sleep 3 4 dr = webdriver.Chrome() 5 dr.get( ...