题目

玩完骰子游戏之后,你已经不满足于骰子游戏了,你要玩更高级的游戏。

今天你瞄准了下述的好玩的游戏:

首先是主角:塔。你有N座塔一列排开。每座塔各自有高度,有可能相等。

这个游戏就不需要地图了。

你每次可以选择相邻的两座塔合并在一起,即这两座塔的高度叠加后变成了同一座塔。然后原本分别与这两座塔相邻的塔变得与这座新的塔相邻。

你的目标是在使用最少的操作次数在游戏的最后获得一列塔,这些塔的高度从左到右形成一个不下降的数列。

分析

这是到结论题。。。

结论一:每个块越小越好。

so,设\(f_i\)表示处理完了i的最小操作次数。再设\(h_i\)表示最优情况下的\(g_i\)的i所在的塔的高度最小值。

转移为:

\[f_i=min(f_i,f_j+i-j-1(g_j<=sum(j+1...i)))
\]

这是\(O(n^2)\)的。

我们想办法优化它,

首先,因为\(f_i+1>=f_{i+1}\)

结论二,当我们枚举j从后往前搜,当高度合法,就是最优的答案,也就可以break。

但是,这还是超时了。

我们打个单调队列。

#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
const long long maxlongint=2147483647;
const long long mo=1000000007;
const long long N=1000025;
using namespace std;
long long f[N],a[N],n,maxa,ans=maxlongint,sum[N],g[N],d[N];
int main()
{
memset(f,0,sizeof(f));
memset(g,0,sizeof(g));
scanf("%lld",&n);
f[0]=g[0]=0;
long long l,r;
d[l=r=1]=0;
for(long long i=1;i<=n;i++) scanf("%lld",&a[i]),maxa=max(a[i],maxa),sum[i]=sum[i-1]+a[i];
for(long long i=1;i<=n;i++)
{
while(g[d[l+1]]+sum[d[l+1]]<=sum[i] && l<r) l++;
long long sigma=sum[i]-sum[d[l]];
f[i]=f[d[l]]+i-d[l]-1;
g[i]=sigma;
while(g[d[r]]+sum[d[r]]>=sum[i]+g[i] && l<=r) r--;
d[++r]=i;
}
printf("%lld",f[n]);
}

【NOIP2012模拟11.1】塔(加强)的更多相关文章

  1. 【LintCode·容易】用栈模拟汉诺塔问题

    用栈模拟汉诺塔问题 描述 在经典的汉诺塔问题中,有 3 个塔和 N 个可用来堆砌成塔的不同大小的盘子.要求盘子必须按照从小到大的顺序从上往下堆 (如:任意一个盘子,其必须堆在比它大的盘子上面).同时, ...

  2. JZOJ 3509. 【NOIP2013模拟11.5B组】倒霉的小C

    3509. [NOIP2013模拟11.5B组]倒霉的小C(beats) (File IO): input:beats.in output:beats.out Time Limits: 1000 ms ...

  3. JZOJ 3508. 【NOIP2013模拟11.5B组】好元素

    3508. [NOIP2013模拟11.5B组]好元素(good) (File IO): input:good.in output:good.out Time Limits: 2000 ms  Mem ...

  4. 8.1 NOIP模拟11

    8.1 NOIP模拟 11 今天上午返校之后,颓了一会,然后下午就开始考试,中午睡着了,然后刚开始考试的时候就困的一匹,我一看T1,woc,这不是之前线段树专题的题啊,和那道题差不多,所以我..... ...

  5. JZOJ 3518. 【NOIP2013模拟11.6A组】进化序列(evolve)

    3518. [NOIP2013模拟11.6A组]进化序列(evolve) (File IO): input:evolve.in output:evolve.out Time Limits: 1000 ...

  6. JZOJ 3505. 【NOIP2013模拟11.4A组】积木(brick)

    3505. [NOIP2013模拟11.4A组]积木(brick) (File IO): input:brick.in output:brick.out Time Limits: 1000 ms Me ...

  7. JZOJ 3526. 【NOIP2013模拟11.7A组】不等式(solve)

    3526. [NOIP2013模拟11.7A组]不等式(solve) (File IO): input:solve.in output:solve.out Time Limits: 1000 ms M ...

  8. JZOJ 4298. 【NOIP2015模拟11.2晚】我的天

    4298. [NOIP2015模拟11.2晚]我的天 (File IO): input:ohmygod.in output:ohmygod.out Time Limits: 1000 ms Memor ...

  9. JZOJ 3929. 【NOIP2014模拟11.6】创世纪

    3929. [NOIP2014模拟11.6]创世纪 (Standard IO) Time Limits: 1000 ms Memory Limits: 65536 KB Description 上帝手 ...

随机推荐

  1. Cmake + VS2013编译opencv

    下载之后,使用cmake转为vs解决方案的时候,配置OPENCV_EXTRA_MODULES_PATH=<path to opencv_contrib/modules/>,然后才能使用ex ...

  2. OUTLOOK、foxmail等无法直接打开邮件中的超级链接问题

         部分电脑,在OUTLOOK或Foxmail收到隔离邮件通知时,点击发送或删除时,提示“一般性错误,*******************,找不到应用程序”.或打开其它HTML格式的邮件正文中 ...

  3. vue父子组件相互传值的实例

    当子组件需要向父组件传递数据时,就要用到自定义事件 子组件用 $emit()来触发事件,父组件用$on()来监昕子组件的事件 父组件也可以直接在子组件的自定义标签上使用 v-on 来监昕子组件触发的自 ...

  4. 简述前后端分离的情况下,Vue实现点击图片下载到本地(并实现IE11浏览器的兼容)

    1.简述 在前后端分离的项目中涉及跨域问题,通常都会使用token进行验证.最近在前后端分离的项目中在一个问题上搞了很久,就是以前下载附件或者导出数据为文件的时候,在以前的那些项目前端可以直接用 wi ...

  5. Statistics项目学习笔记

    1. http://218.244.157.0:55443/index.html 初始访问时,弹出的窗口为index.html文件,文件有html命令组成.html展现的UI界面用的是WIN10-UI ...

  6. Who will be punished

    Who will be punished Problem Description This time,suddenly,teacher Li wants to find out who have mi ...

  7. [TJOI2019] 甲苯先生的线段树

    臭名昭著的巧合:CF750G 题意:在无限深度的一颗线段树中询问编号和为S的简单路径条数. 题解传送门 这道题相当于在原来基础上多了询问两点间简单路径的编号的的问题. 直觉告诉我们只需要求出两点在线段 ...

  8. PHP:ReflectionClass

    一.简介 ReflectionClass 类报告了一个类的有关信息 ReflectionException 类继承Exception 二.常用函数 ReflectionClass::__constru ...

  9. vue中如何去掉空格

    一.问题 vue中当用户提交表单时,有的数据需要去掉前后空格然后再向后端发送. 二.解决方法 首先可以使用v-model.trim这个v-model修饰符去解决它,但是当用户输入\u200B时,这个方 ...

  10. day 14 装饰器

    装饰器:装饰,装修,房子就可以住,如果装修,不影响你住,而且体验更加,让你生活中增加了很多功能:洗澡,看电视,沙发.器:工具.开放封闭原则:开放:对代码的拓展开放的, 更新地图,加新枪,等等.封闭:对 ...