https://www.lydsy.com/JudgeOnline/problem.php?id=1233

描述:

奶牛们讨厌黑暗。 为了调整牛棚顶的电灯的亮度,Bessie必须建一座干草堆使得她能够爬上去够到灯泡 。一共有N大包的干草(1<=N<=100000)(从1到N编号)依靠传送带连续的传输进牛棚来。第i包干草有一个 宽度W_i(1<=w_i<=10000)。所有的干草包的厚度和高度都为1. Bessie必须利用所有N包干草来建立起干草堆,并且按照他们进牛棚的顺序摆放。她可以相放多少包就放 多少包来建立起tower的地基(当然是紧紧的放在一行中)。接下来他可以放置下一个草包放在之前一级 的上方来建立新的一级。注意:每一级不能比下面的一级宽。她持续的这么放置,直到所有的草包都被安 置完成。她必须按顺序堆放,按照草包进入牛棚的顺序。说得更清楚一些:一旦她将一个草包放在第二级 ,她不能将接下来的草包放在地基上。 Bessie的目标是建立起最高的草包堆。

输入:

第1行:一个单一的整数N。 第2~N+1行:一个单一的整数:W_i。

输出:

第一行:一个单一的整数,表示Bessie可以建立的草包堆的最高高度。

首先容易想到,题目等价于将1~N的序列反置,然后在序列上划分区间,使得前面的区间权值之和小于等于后面区间权值之和。

于是马上就想到贪心,前面的区间权值之和越小越好,就这么贪,但是这种策略是错的。

比如对于反置后的序列

2 1 1000 ……

那么第一个区间假如只是2的话,第二个区间只能选1 和 1000 ,权值和为1001

假如第一个区间选2 和 1 ,那么第二个区间的权值和就为1000

明显后者对接下来更有利,第一个区间为第二个区间分摊了长度。

因此对于第i个区间我们应该选择可以选择的权值的最大值。

len[i] : 第i个数所在的层数稻草堆叠的宽度

sum[i] : len[i]的前缀和

dp[i] : 第1~i个数所能划分的最大的区间

那么对于第i个数来说,它的上一层的宽度需要长度小于等于它所在的层数的长度,也就是

len[j] <= sum[i] - sum[j+1]

然后为了dp[i]更新到的答案尽量大,j应该尽量大(或者说为了上一层能够尽可能分摊更多的权值,需要j尽可能的大)

这个普通的dp递推需要O(n^2)的时间复杂度,是不可以接受的,对于这题可以使用单调队列优化

#include<bits/stdc++.h>
#define ll long long
const int maxn = 1e5 + 7;
using namespace std;
int num[maxn], sum[maxn], dp[maxn], len[maxn];
int q[maxn];
int n;
int main() {cin >> n;for (int i = 1; i <= n; i++)scanf("%d", num + n - i + 1);for (int i = 1; i <= n; i++)sum[i] = sum[i - 1] + num[i];int l = 1, r = 0;for (int i = 1; i <= n; i++) {//同一层长度最小//找到满足条件的j的最大值,需要判断优先队列的下一位,也就是q[l+1]是否满足条件//假如满足条件则l++继续判断,否则当前的q[l]则是答案while (l < r&&sum[i] - sum[q[l + 1]] >= len[q[l + 1]])l++;dp[i] = dp[q[l]] + 1;len[i] = sum[i] - sum[q[l]];// 由len[j]<=sum[i]-sum[j] 得 ,len[j]+sum[j]<=sum[i], 假如// 后面加入的len[i]+sum[i] 比前面的大,那么前面的就没有存在的// 必要了while (l < r&&len[i]+sum[i]>=len[q[r]]+sum[q[r]])r--;q[++r] = i;}cout << dp[n] << endl;
}

bzoj 1233 干草堆tower 优先队列优化dp相关推荐

  1. BZOJ 1233 干草堆 (单调队列优化DP)

    \(BZOJ~1233~~\)干草堆: (题目特殊性质) \(solution:\) 很妙的一道题目,开始看了一眼觉得是个傻逼贪心,从后往前当前层能多短就多短,尽量节省花费.但是这是DP专题,怎么会有 ...

  2. 干草堆[单调队列优化DP]

    传送门 f[i] 表示到第i个时,第i个下面的干草的宽度 很明显宽度越窄,高度越高 需满足 也就是 我们发现,对于k>j>i,若 则j比k优 #include<bits/stdc++ ...

  3. bzoj-1233 [Usaco2009Open]干草堆tower

    1233: [Usaco2009Open]干草堆tower** 题目链接 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1030 Solved: 49 ...

  4. [bzoj1233]干草堆tower

    [bzoj1233]干草堆tower 首先,倒着直接贪心是会被卡的 数据如下: 6 11 10 7 3 2 6 然后我们可以发现一些性质:每个点取能取的最小的宽度,这样一定能构成最优解 然后状态是f[ ...

  5. [BZOJ1233][Usaco2009Open]干草堆tower(单调队列优化)

    传送门 题意搞skr人-,其实就是堆方块: 有n(n<=100000)个干草,每堆有个宽度,现在要且分成若干段,把每一段的干草按顺序堆起来形成一个多层的干草堆(所以下标越小的干草堆放在越下面)且 ...

  6. Bzoj1233 [Usaco2009Open]干草堆tower

    Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 811  Solved: 378 Description 奶牛们讨厌黑暗. 为了调整牛棚顶的电灯的亮度 ...

  7. bzoj 1233: [Usaco2009Open]干草堆tower【dp+单调栈】

    参考:https://www.cnblogs.com/N-C-Derek/archive/2012/07/11/usaco_09_open_tower.html 虽然长得很像斜率优化,但是应该不算-- ...

  8. 【BZOJ 1233】 干草堆

    [题目链接] 点击打开链接 [算法] 这题有一个性质 : 位于顶层的干草堆可以满足宽度最小且高度最高 根据这个性质,用单调队列优化DP,即可 [代码] #include<bits/stdc++. ...

  9. 洛谷 Golden Sword(dp,优先队列优化【含板子】)|| 补充练习:洛谷 跳房子

    题目链接: 「SWTR-03」Golden Sword - 洛谷 思路: 设表示放第i个原料,锅里共有 j 个时的耐久度之和. 容易知道dp方程为,其中 这样就可以写出暴力dp的代码如下:(需要枚举i ...

最新文章

  1. 一年成为emacs高手
  2. 大学生计算机社团该办什么活动,大学生社团活动策划方案
  3. 企业为什么要建设数据分析平台?应该怎么建?
  4. 北斗三号频点_海格通信发布国内首批北斗三号双模应用专用芯片及系统解决方案,对外展示“北斗+5G”的关键成果转化...
  5. android 蓝牙控制继电器——单片机控制端
  6. Julia :复合类型struct当索引时
  7. 容器技术Docker K8s 36 容器服务ACK基础与进阶-应用与发布管理
  8. 教你如何用java开发Alexa语音设备。全程详细介绍。
  9. 面试必备 | 带你彻底搞懂 Python 生成器。
  10. 安大计算机学院ACM,全员考研上岸、ACM大赛获奖,乘风破浪的学霸寝室!
  11. 服务器ssd硬盘格式化,格式化没你想象的简单 格式选错了对SSD有损
  12. 什么是关键字驱动框架?
  13. jupyter中python3如何导入文件_无法读取Azure Jupyter Notebook(Python 2和3)中的“ .parquet”文件 - python...
  14. 以太网没有有效的ip怎么解决
  15. 来自北京大学NOIP金牌选手yxc的常用代码模板3——搜索与图论
  16. 直播视频转换为文稿,分分钟就可以实现的方法来了
  17. FTDI for linux的安装指南
  18. 关于tomcat启动后http://localhost:8080/打不开页面的解决方案
  19. 英特尔推出全新 NUC 套件和 NUC Mini PC
  20. 网页特效应用二期(电脑新建一个文本文档复制粘贴改后缀名为.html就能用)

热门文章

  1. iOS 图片捏合放大缩小 点击放大缩小
  2. 南邮——计算机图像学——光照、冯氏光照模型
  3. 雷电模拟器frida脱壳
  4. 浅谈软件可视化分析内存消耗综述中的识别方法
  5. 网页禁止鼠标右键复制的解决办法
  6. Flutter版本 网易云音乐
  7. 小红书商品详情API接口(商品详情页面数据接口)
  8. java poi操作word模版 导出word文档(附工具类)
  9. USB转TTL串口板使用问题
  10. 功率开关的RC-Snubber电路设计