\(\mathcal{Description}\)

  Link.

  有 \(n\) 支蜡烛,第 \(i\) 支的坐标为 \(x_i\),初始长度为 \(a_i\),每单位时间燃烧变短 \(1\) 直到长度为 \(0\)。你从 \(0\) 位置出发,每次可以向左或向右走 \(1\) 单位,走到一个蜡烛的位置可以吹熄蜡烛。求最多能保留的蜡烛长度之和。

  \(n\le300\)。

\(\mathcal{Solution}\)

  和 甲虫 这题比较像,可以说是相同思路的不同实现方法。问题的核心自然是费用提前计算,我们需要知道想要吹熄的蜡烛数量才能计算当前行动一步带来的总长度损失。注意到 \(n\) 较小,可以直接把这一信息记入状态。

  具体地,加入一支 \(x_{n+1}=a_{n+1}=0\) 的蜡烛,设按坐标排序后该蜡烛的下标为 \(p\)。令 \(f(l,r,0/1,k)~([l,r]\ni p,k\in[0,n])\) 表示当前经过了区间 \([l,r]\) 内的蜡烛位置,停留在 \(l/r\),还希望在这个区间以外获得 \(k\) 支蜡烛。通过忽略“蜡烛长度非负”这一限制,把最大化最大值转化成最大化任意值,可以轻松 DP 求解。复杂度 \(\mathcal O(n^3)\)。

\(\mathcal{Code}\)

/*~Rainybunny~*/

#include <bits/stdc++.h>

#define rep( i, l, r ) for ( int i = l, rep##i = r; i <= rep##i; ++i )
#define per( i, r, l ) for ( int i = r, per##i = l; i >= per##i; --i ) typedef long long LL;
typedef std::pair<int, int> PII;
#define fi first
#define se second const int MAXN = 300;
const LL LINF = 1ll << 60;
int n;
LL f[MAXN + 5][MAXN + 5][2][MAXN + 5];
PII cdl[MAXN + 5]; inline LL dabs( const LL u ) { return u < 0 ? -u : u; }
inline void chkmax( LL& u, const LL v ) { u < v && ( u = v ); } int main() {
scanf( "%d", &n ), ++n;
rep ( i, 2, n ) scanf( "%d %d", &cdl[i].fi, &cdl[i].se ); std::sort( cdl + 1, cdl + n + 1 );
int p = std::lower_bound( cdl + 1, cdl + n + 1, PII( 0, 0 ) ) - cdl; rep ( i, 1, n ) rep ( j, i + 1, n ) rep ( t, 0, 1 ) rep ( k, 0, n ) {
f[i][j][t][k] = -LINF;
}
rep ( i, 0, n ) f[p][p][0][i] = 0;
LL ans = 0;
rep ( len, 0, n - 1 ) {
for ( int i = 0, l, r; i <= len; ++i ) {
if ( ( l = p - i ) <= 0 || ( r = p + len - i ) > n ) continue;
int x[2] = { cdl[l].fi, cdl[r].fi };
rep ( t, 0, 1 ) {
rep ( k, 0, n ) {
LL cur = f[l][r][t][k];
if ( cur == -LINF ) continue;
if ( !k ) { chkmax( ans, cur ); continue; }
if ( l > 1 ) {
chkmax( f[l - 1][r][0][k - 1], cur + cdl[l - 1].se
- dabs( x[t] - cdl[l - 1].fi ) * k );
chkmax( f[l - 1][r][0][k], cur
- dabs( x[t] - cdl[l - 1].fi ) * k );
}
if ( r < n ) {
chkmax( f[l][r + 1][1][k - 1], cur + cdl[r + 1].se
- dabs( x[t] - cdl[r + 1].fi ) * k );
chkmax( f[l][r + 1][1][k], cur
- dabs( x[t] - cdl[r + 1].fi ) * k );
}
}
}
}
}
printf( "%lld\n", ans );
return 0;
}

Solution -「ABC 219H」Candles的更多相关文章

  1. Solution -「ABC 215H」Cabbage Master

    \(\mathcal{Description}\)   Link.   有 \(n\) 种颜色的,第 \(i\) 种有 \(a_i\) 个,任意两球互不相同.还有 \(m\) 个盒子,每个盒子可以被放 ...

  2. Solution -「ABC 213G」Connectivity 2

    \(\mathcal{Description}\)   Link.   给定简单无向图 \(G=(V,E)\),点的编号从 \(1\) 到 \(|V|=n\).对于 \(k=2..n\),求 \(H= ...

  3. Solution -「ABC 213H」Stroll

    \(\mathcal{Description}\)   Link.   给定一个含 \(n\) 个结点 \(m\) 条边的简单无向图,每条边的边权是一个常数项为 \(0\) 的 \(T\) 次多项式, ...

  4. Solution -「ABC 217」题解

    D - Cutting Woods 记录每一个切割点,每次求前驱后驱就好了,注意简单判断一下开闭区间. 考场上采用的 FHQ_Treap 无脑莽. #include <cstdio> #i ...

  5. Solution -「ARC 104E」Random LIS

    \(\mathcal{Description}\)   Link.   给定整数序列 \(\{a_n\}\),对于整数序列 \(\{b_n\}\),\(b_i\) 在 \([1,a_i]\) 中等概率 ...

  6. Solution Set -「ABC 217」

      大家好屑兔子又来啦! [A - Lexicographic Order]   说个笑话,\(\color{black}{\text{W}}\color{red}{\text{alkingDead} ...

  7. Solution -「ARC 110E」Shorten ABC

    \(\mathcal{Description}\)   Link.   给定长度为 \(n\),包含 A, B, C 三种字符的字符串 \(S\),定义一次操作为将其中相邻两个不相同的字符替换为字符集 ...

  8. Solution -「CTS 2019」「洛谷 P5404」氪金手游

    \(\mathcal{Description}\)   Link.   有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...

  9. Solution -「BZOJ 3812」主旋律

    \(\mathcal{Description}\)   Link.   给定含 \(n\) 个点 \(m\) 条边的简单有向图 \(G=(V,E)\),求 \(H=(V,E'\subseteq E)\ ...

随机推荐

  1. spring security +MySQL + BCryptPasswordEncoder 单向加密验证 + 权限拦截 --- 心得

    1.前言 前面学习了 security的登录与登出 , 但是用户信息 是 application 配置 或内存直接注入进去的 ,不具有实用性,实际上的使用还需要权限管理,有些 访问接口需要某些权限才可 ...

  2. springboot插件打包跳过单元测试

    只需在pom.xml添加如下即可 <skipTests>true</skipTests> pom文件如下 <?xml version="1.0" en ...

  3. 实验 2 :Mininet 实验 —— 拓扑的命令脚本

    实验2: Mininet 实验--拓扑的命令脚本 一.实验目的 掌握 Mininet 的自定义拓扑生成方法:命令行创建.Python 脚本编写 二 .实验任务 通过使用命令行创建.Python 脚本编 ...

  4. 实验 1 :Mininet 源码安装和可视化拓扑

    实验 1 : Mininet 源码安装和可视化拓扑工具 一 .实验目的 掌握 Mininet 的源码安装方法和 miniedit 可视化拓扑生成工具. 二 .实验任务 使用源码安装 Mininet 的 ...

  5. Hadoop的Shuffle阶段

    原文: https://www.toutiao.com/i6764683672772674062/ 在进入Map之前,首先会将数据从HDFS中读取,进行处理,按照字节偏移量这种之前说的形式处理为K,V ...

  6. JVM调优-1

    JVM运行参数 在jvm中有很多的参数可以进行设置,这样可以让jvm在各种环境中都能够高效的运行.绝大部分的参数保持默认即可. 三种参数类型 标准参数 -help -version -X参数(非标准参 ...

  7. 在pyqt5中展示pyecharts生成的图像

    技术背景 虽然现在很少有人用python去做一些图形化的界面,但是不得不说我们在日常大部分的软件使用中都还是有可视化与交互这样的需求的.因此pyqt5作为一个主流的python的GUI框架地位是非常重 ...

  8. Solon 开发,七、自定义注解开发汇总

    Solon 开发 一.注入或手动获取配置 二.注入或手动获取Bean 三.构建一个Bean的三种方式 四.Bean 扫描的三种方式 五.切面与环绕拦截 六.提取Bean的函数进行定制开发 七.自定义注 ...

  9. Centos下安装Scala(2)

    1.下载压缩包 命令:wget https://downloads.lightbend.com/scala/2.11.8/scala-2.11.8.tgz 2.解压缩包 命令:tar -xzvf sc ...

  10. golang操作mysql

    1. 安装mysql驱动库和sqlx基于官方sql库的扩展库 go get github.com/go-sql-driver/mysql go get github.com/jmoiron/sqlx ...