[Vijos1617] 超级教主(DP + 单调队列)
2024-09-30 02:24:09
设 f[i] 表示吃完 f[i] 及其以下的能量球后所剩下的能量。
所以 f[i] = max(f[i], f[j] + (sum[i] - sum[j]) - i * 100) ( 0 <= j < i )
但这是 O(n2) 的,肯定超时,
把上面的式子变换以下得到 f[i] = max(f[i], (f[j] - sum[j]) + sum[i] - i * 100) ( 0 <= j < i )
也就是说,f[i] 只与 f[j] - sum[j] 有关,sum[i] - i * 100 可看做常数,
要想使 f[i] 最大,需要让 f[j] - sum[j] 最大,
可用单调队列维护最大 f[j] - sum[j],
如果 f[q[h]] < i * 100 说明能量不够跳到当前点,而能量跳不到当前点肯定也跳不到后面的点,h++
——代码
#include <cstdio> const int MAXN = ;
int n, m, h = , t;
int sum[MAXN], q[MAXN], f[MAXN]; int main()
{
int i, j, x;
scanf("%d %d", &n, &f[]);
for(i = ; i <= n; i++)
{
scanf("%d", &x);
sum[i] = x + sum[i - ];
}
t++;
for(i = ; i <= n; i++)
{
while(h <= t && f[q[h]] < i * ) h++;
f[i] = f[q[h]] - sum[q[h]] + sum[i] - i * ;
while(h <= t && f[q[t]] - sum[q[t]] < f[i] - sum[i]) t--;
q[++t] = i;
}
printf("%d", f[n]);
return ;
}
最新文章
- Django 1.7 Tutorial 学习笔记
- Nodejs 的 Express框架 学习体会 补充中。。。
- JavaScript第一天 改变DIV的样式
- keepalived+nginx高可用负载均衡环境搭建
- HttpCookie加匿名类实现多语言
- C# 生成windows 服务打包程序
- 《BI项目笔记》创建时间维度(1)
- window下部署php_redis扩展
- Java中hashcode,equals和==
- Guava API学习之Multimap
- Unix 主机认证配置
- 用Bottle开发web程序(二)
- Ubuntu14.04下搜狗输入法的安装及配置
- Oracle WorkFlow(工作流)(二)
- OpenGL OpenCV根据视差图重建三维信息
- [LeetCode] Most Profit Assigning Work 安排最大利润的工作
- SQL Server初探
- Random()种子数
- mysql中使用存储过程方法中的注意事项
- iis下php 500错误