luoguP4393Sequence
https://www.luogu.org/problem/P4393
题意
给你n个点的一个数列,每次可以合并两个相邻的数为他们的最大值,且代价为这两个数的最大值,求将整个序列合并为1个数的最小代价
n≤1e6
分析
个人做这题很玄.....
我们先考虑三个数a,b,c , 且序列的顺序为{a, b, c}的情况...可得
当 a < b < c时,在最优的情况下, 最大值c只有一次被计算在内(即只对最终的代价 的贡献是一个c), 并且,b被算了一次。
当a < b, b > c时, 最大值b被计算了两次,而a和没有被计算在内
这样,多画几个图自己看看(虽然找规律(即找贪心的策略)花费的时间可能比较多...像我做这题的时候就是在纸上涂涂画画...), 然后我们就可以得出贪心策略:
我们将每个点 i 与它左右两边相邻点i-1, i+1比较大小,并记录比a[i]小的相邻点的个数is[i](0, 1 或2),那么a[i]对答案(即最终代价)的贡献就是a[i]*is[i].
证明: a[i]>a[i-1] && a[i]>a[i+1]时, 无论怎么合并 i 两边的数, 到后来, a[i]总被计算两次。
只有一个成立时(假设是a[i]>a[i+1]不成立), a[i]总被计算一次,而a[i+1]的计算次数就 >= 1了,a[i] 一定是与a[i+1]合并的。
注意合并操作的实现和边界1, n的is值即可(其实我也就是试试,谁知道真过了emm....
#include<cstdio>
using namespace std;
#define ll long long
#define MAX 1000000
int n;
int a[MAX];
int is[MAX];
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; i++) scanf("%d",&a[i]);
for(int i = 2; i < n; i++) {
if(a[i] >= a[i+1]) {
is[i]++;
if(a[i] == a[i+1]) is[i+1]--;
}
if(a[i] >= a[i-1])
is[i]++;
}
if(a[1] > a[2]) is[1] = 1;
if(a[n] > a[n-1]) is[n] = 1;
ll ans = 0;
for(int i = 1; i <= n; i++) {
ans += (ll)a[i]*is[i];
}
printf("%lld",ans);
}
luoguP4393Sequence的更多相关文章
随机推荐
- 面向对象程序设计(JAVA) 第10周学习指导及要求
2019面向对象程序设计(Java)第10周学习指导及要求 (2019.11.1-2019.11.4) 学习目标 1.掌握java异常处理技术: 2.了解断言的用法: 3.了解日志的用途: 4.掌 ...
- destoon模块绑定二级域名出现 File not found解决办法
昨天晚上帮一个朋友给我说他绑定模块二级域名出现 File not found,所以今天分享关于解决办法. 模块启用二级域名后,首页打开正常,但是点内容页和列表页出现File not found. 解决 ...
- to_sql, to_csv, to_excel, to_json
1.to_sql def to_sql(self, name, con, schema=None, if_exists="fail", index=True, index_labe ...
- Python Singleton Pattern(单例模式)
简介 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. 当 ...
- Paper | Residual Dense Network for Image Super-Resolution
目录 Residual dense block & network 和DenseNet的不同 摘要和结论 发表在2018年CVPR. 摘要和结论都在强调方法的优势.我们还是先从RDN的结构看起 ...
- 宝塔面板+djiango+mod wsgi +apache 配置多项目站点
在一台服务器上同时有多个djiango项目,那么就需要配置多站点,利用不同的域名不同的端口 同时存在多个项目. 环境,centos + 宝塔面板+apache+django 1.在centos环境下 ...
- Qt 编译配置相关总结
MinGW 与 MSVC 编译的区别 我们可以从 Qt 下载页面看到两种版本编译器,如下图: 我们来对比一下这两个编译器的区别: MSVC 是指微软的 VC 编译器. MinGW 是 Minimali ...
- 六、Spring之初步认识AOP
Spring之初步认识AOP [1]AOP概览 什么是AOP?(来自百度) 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行 ...
- github clone加速
1. 在https://asm.ca.com/zh_cn/ping.php 网址中查询 github.global.ssl.fastly.net 及 github.com 的 china地区 avr ...
- ansible碎碎念
1. Using a SSH password instead of a key is not possible because Host Key checking is enabled and ss ...