DP优化

原题:

LHX教主很能跳,因为Orz他的人太多了。教主跳需要消耗能量,每跳1米就会消耗1点能量,如果教主有很多能量就能跳很高。
教主为了收集能量,来到了一个神秘的地方,这个地方凡人是进不来的。在这里,教主的正上方每100米处就有一个能量球(也就是这些能量球位于海拔100,200,300……米处),每个能量球所能提供的能量是不同的,一共有N个能量球(也就是最后一个能量球在N×100米处)。教主为了想收集能量,想跳着吃完所有的能量球。教主可以自由控制他每次跳的高度,接着他跳起把这个高度以下的能量球都吃了,他便能获得能量球内的能量,接着吃到的能量球消失。教主不会轻功,教主不会二段跳,所以教主不能因新吃到的能量而变化此次跳跃的高度。并且教主还是生活在地球上的,所以教主每次跳完都会掉下来。
问教主若要吃完所有的能量球,最多还能保留多少能量。

N≤2000000

保证对于所有数据,教主都能吃到所有的能量球,并且能量球包含的能量之和不超过2^31-1。

sum[i]表示a[i]的前缀和,很容易推出状态转移方程:f[i]=max{j<i && f[j]>=i*100 | f[j]+sum[i]-sum[j]-i*100}

但是数据达到2000000,n^2会T,这是后就要优化

DP优化方法有很多,常用的是记录可行决策然后二分,单调队列,斜率优化,我这么弱斜率优化当然不会,这题似乎不符合单调性质,所以我们搞单调队列

上面的状态转移方程↑中sum[i]-i*100是不会变的,需要考虑的就是f[j]-sum[j]

就可以维护单调队列:如果f[i]>f[队头]就进队,f[j]<i*100的出对,然后在队里找就行了

然而依旧会T

书上说f[i]-s[i]单调递减的,过程比较长,有兴趣的同学可以试着自己推到(逃

又因为i*100是单调递增的,所以只需要记录一个temp表示上一个用到的决策点,从temp往后找到一个f[j]>=i*100就行了

因为f[j]-sum[j]单调递减且i*100单调递增,所以如果有f[j]>=i*100的f[j]>=(i-1)*100也肯定满足,因此从直接从temp开始找就行了,不用管temp前面的

单调性这种东西给数据打个表比较容易发现,优化DP时打个表挺好的

代码;

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int read(){int z=,mark=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')mark=-; ch=getchar();}
while(ch>=''&&ch<=''){z=(z<<)+(z<<)+ch-''; ch=getchar();}
return z*mark;
}
int n,m,a[];
int sum[];
int f[];
int temp;
int main(){//freopen("ddd.in","r",stdin);
memset(f,,sizeof(f));
cin>>n>>m;
sum[]=;
for(int i=;i<=n;i++){ a[i]=read(); sum[i]=a[i]+sum[i-];}
f[]=m; temp=;
for(int i=;i<=n;i++){
for(;temp<i;temp++)if(f[temp]>=i*) break;
f[i]=f[temp]+sum[i]-sum[temp]-i*;
}
cout<<f[n]<<endl;
return ;
}

【P1326】超级教主的更多相关文章

  1. [Vijos1617] 超级教主(DP + 单调队列)

    传送门 设 f[i] 表示吃完 f[i] 及其以下的能量球后所剩下的能量. 所以 f[i] = max(f[i], f[j] + (sum[i] - sum[j]) - i * 100) ( 0 &l ...

  2. 120项改进:开源超级爬虫Hawk 2.0 重磅发布!

    沙漠君在历时半年,修改无数bug,更新一票新功能后,在今天隆重推出最新改进的超级爬虫Hawk 2.0! 啥?你不知道Hawk干吗用的? 这是采集数据的挖掘机,网络猎杀的重狙!半年多以前,沙漠君写了一篇 ...

  3. OpenGL超级宝典笔记----框架搭建

    自从工作后,总是或多或少的会接触到客户端3d图形渲染,正好自己对于3d图形的渲染也很感兴趣,所以最近打算从学习OpenGL的图形API出发,进而了解3d图形的渲染技术.到网上查了一些资料,OpenGL ...

  4. 推荐10款超级有趣的HTML5小游戏

    HTML5的发展速度比任何人的都想像都要更快.更加强大有效的和专业的解决方案已经被开发......甚至在游戏世界中!这里跟大家分享有10款超级趣味的HTML5游戏,希望大家能够喜欢! Kern Typ ...

  5. 兼容SQLSERVER、Oracle、MYSQL、SQLITE的超级DBHelper

    本示例代码的关键是利用.net库自带的DbProviderFactory来生产数据库操作对象. 从下图中,可以看到其的多个核心方法,这些方法将在我们的超级DBHelper中使用. 仔细研究,你会发现每 ...

  6. [LeetCode] Super Ugly Number 超级丑陋数

    Write a program to find the nth super ugly number. Super ugly numbers are positive numbers whose all ...

  7. jquery.on()超级方法

    $.on()方法是jquery1.7之后的一个超级方法,将事件绑定和事件委托整合到一个函数中去,支持绑定多个事件,并且可以绑定自定义事件.使用起来很方便. demo传送门 事件委托 首先说一下事件委托 ...

  8. BZOJ 2006: [NOI2010]超级钢琴

    2006: [NOI2010]超级钢琴 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2613  Solved: 1297[Submit][Statu ...

  9. 跟着百度学PHP[6]超级全局变量

    超级全局变量在PHP 4.1.0之后被启用, 是PHP系统中自带的变量,在一个脚本的全部作用域中都可用. 参考文献:http://www.runoob.com/php/php-superglobals ...

随机推荐

  1. android asyncTask 详解

    只看http://www.cnblogs.com/xiaoluo501395377/p/3430542.html  足以

  2. Android中 服务里的方法抽取成接口

    1 写个类继承Service 重写 onBind方法 返回一个IBinder 对象(传递到连接成功时用) 2 服务中 写一个内部类 继承IBinder 并且实现一个接口(用于抽取方法)继承IBinde ...

  3. Visual Studio 2013 如何关闭调试而不关闭IIS Express

    在VS主面板打开:工具->选项->调试->编辑继续   取消选中[启用"编辑并继续"] 就OK了 (英文版的请对应相应的操作) 不过这是针对所有的调试,如果你想针 ...

  4. 未能加载文件或程序集“DeveloperKit10.1/DotNet/ESRI.ArcGIS.ADF.Local.或它的某一个依赖项

    使用VS2010进行ArcGIS Engine 10.1进行开发过程中,出现: 错误 1 未能加载文件或程序集“file:///D:/ArcGIS/DeveloperKit10.0/DotNet/ES ...

  5. Ubuntu 启动黑屏解决

    要sudo apt-get install xserver...................balabala...   then.... sudo gedit /boot/grub/grub.cf ...

  6. Comments

    Nothing can be quite so helpful as a well-placed comment.Nothing can clutter up a module more than f ...

  7. linux邮件服务器postfix配置实例

    linux邮件服务器postfix配置实例(超级详细!!!) 2013-03-13 13:30:21 标签:邮件服务器 linux 1. 系统安装:1)centos4.3 选上MAIL组件里的全部.2 ...

  8. Android 常见的广播 action常量

    Intent.ACTION_AIRPLANE_MODE_CHANGED; //关闭或打开飞行模式时的广播 Intent.ACTION_BATTERY_CHANGED; //充电状态,或者电池的电量发生 ...

  9. E - 今年暑假不AC

      Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Des ...

  10. 【转】ROC和AUC介绍以及如何计算AUC

    转自:https://www.douban.com/note/284051363/ ROC(Receiver Operating Characteristic)曲线和AUC常被用来评价一个二值分类器( ...