传送门

设 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 ;
}

最新文章

  1. Django 1.7 Tutorial 学习笔记
  2. Nodejs 的 Express框架 学习体会 补充中。。。
  3. JavaScript第一天 改变DIV的样式
  4. keepalived+nginx高可用负载均衡环境搭建
  5. HttpCookie加匿名类实现多语言
  6. C# 生成windows 服务打包程序
  7. 《BI项目笔记》创建时间维度(1)
  8. window下部署php_redis扩展
  9. Java中hashcode,equals和==
  10. Guava API学习之Multimap
  11. Unix 主机认证配置
  12. 用Bottle开发web程序(二)
  13. Ubuntu14.04下搜狗输入法的安装及配置
  14. Oracle WorkFlow(工作流)(二)
  15. OpenGL OpenCV根据视差图重建三维信息
  16. [LeetCode] Most Profit Assigning Work 安排最大利润的工作
  17. SQL Server初探
  18. Random()种子数
  19. mysql中使用存储过程方法中的注意事项
  20. iis下php 500错误

热门文章

  1. 字符串、数组、json
  2. laravel学习笔记(一)
  3. Android从图库选择照片
  4. PYTHON PIP和kivy安装教程
  5. mysql中的 enum (枚举)
  6. 一条HTTP的生命之旅(高频面试问题)
  7. 查看cuda版本和cudann
  8. 一个小笔记(2):Socket网络编程
  9. C++构造函数(复制构造函数)、析构函数
  10. windows10家庭版 远程桌面报错