USACO 2009 Open 干草塔 Tower of Hay
USACO 2009 Open 干草塔 Tower of Hay
Description
为了调整电灯亮度,贝西要用干草包堆出一座塔,然后爬到牛棚顶去把灯泡换掉。干草 包会从传送带上运来,共会出现N包干草,第i包干草的宽度是Wi,高度和长度统一为1。干 草塔要从底层开始铺建。贝西会选择最先送来的若干包干草,堆在地上作为第一层,然后再 把紧接着送来的几包干草包放在第二层,再铺建第三层……重复这个过程,一直到所有的干 草全部用完。每层的干草包必须紧靠在一起,不出现缝隙,而且为了建筑稳定,上层干草的 宽度不能超过下层的宽度。按顺序运来的干草包一定要都用上,不能将其中几个干草包弃置 不用。贝西的目标是建一座最高的塔,请你来帮助她完成这个任务吧。
Input Format
第一行:单个整数:N,1 ≤ N ≤ 100000 第二行到N + 1行:第i + 1行有一个整数Wi,1 ≤ Wi ≤ 10000
Output Format
第一行:单个整数,表示可以建立的最高高度
Sample Input
3
1
2
3
Sample Output
2
Hint
将1 和2放在第一层,将3放在第二层
Solution
本题很容易想到从后往前贪心每次只拿到恰好不比上一层小的干草,但这贪心其实是错的。
如 999 999 1 3这样的数据答案应是3但是贪心得到的是2。
由于本题阶段性非常明显我们考虑倒着DP。
对于后i层的干草堆成的塔a对答案的影响有两部分:
1.塔a最后一层的宽度越短则前面的干草堆成的塔高度更高。
2.塔a本身的高度。
DP显然难以同时考虑两部分,我们考虑用贪心合并这两个部分:
一定存在一种方案使得干草堆成的塔最高的同时最底层也最短。
所以我们可以用f[i]表示i到n这些干草能堆成的最大高度,g[i]表示最底层的最短宽度。
f[i]=f[j]+1,g[i]=w[j-1,i] (j>=i,w[j-1,i]>=g[j])
但是如果直接暴力转移的化时间复杂度是\(O(n^2)\)的不足以胜任这个数据范围。
观察转移方程可以发现在满足转移条件的情况下,j越大则f[i]、g[i]都更优,故此可以用单调队列优化转移:把j存进队列中,若队头元素的下一位满足转移条件则把队头踢出,每次入队时如果队尾比要入队的元素还要晚满足条件则把队尾删除,每次转移时直接取队头进行转移。
Code
#include <cstdio>
#include <algorithm>
#define N 100007
int n,s,t,q[N],f[N],g[N],w[N];
int main(){
scanf("%d",&n);
for (int i=1;i<=n;++i) scanf("%d",&w[i]),w[i]+=w[i-1];
q[0]=n+1;
for (int i=n;i;--i){
while (s<t&&w[q[s+1]-1]-w[i-1]>=g[q[s+1]]) ++s;
f[i]=f[q[s]]+1,g[i]=w[q[s]-1]-w[i-1];
while (s<=t&&g[q[t]]-g[i]>=w[q[t]-1]-w[i-1]) --t;
q[++t]=i;
}
printf("%d\n",f[1]);
return 0;
}
USACO 2009 Open 干草塔 Tower of Hay的更多相关文章
- USACO 2009 Open 干草塔 Tower of Hay(贪心+单调队列优化DP)
https://ac.nowcoder.com/acm/contest/1072/B Description 为了调整电灯亮度,贝西要用干草包堆出一座塔,然后爬到牛棚顶去把灯泡换掉.干草包会从传送带上 ...
- [USACO09Open] Tower of Hay 干草塔
为了调整电灯亮度,贝西要用干草包堆出一座塔,然后爬到牛棚顶去把灯泡换掉.干草包会从传送带上运来,共会出现N包干草,第i包干草的宽度是W i ,高度和长度统一为1.干草塔要从底层开始铺建.贝西会选择最先 ...
- 【BZOJ 1233】 [Usaco2009Open]干草堆tower (单调队列优化DP)
1233: [Usaco2009Open]干草堆tower Description 奶牛们讨厌黑暗. 为了调整牛棚顶的电灯的亮度,Bessie必须建一座干草堆使得她能够爬上去够到灯泡 .一共有N大包的 ...
- bzoj1233[Usaco2009Open]干草堆tower 单调队列优化dp
1233: [Usaco2009Open]干草堆tower Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 983 Solved: 464[Submi ...
- bzoj1615 / P2903 [USACO08MAR]麻烦的干草打包机The Loathesome Hay Baler
P2903 [USACO08MAR]麻烦的干草打包机The Loathesome Hay Baler 细节题.$O(n^{2})$的$bfs$可过. #include<iostream> ...
- bzoj 1233: [Usaco2009Open]干草堆tower
1233: [Usaco2009Open]干草堆tower Description 奶牛们讨厌黑暗. 为了调整牛棚顶的电灯的亮度,Bessie必须建一座干草堆使得她能够爬上去够到灯泡 .一共有N大包的 ...
- USACO 2009 Feb 股票市场 Stock Market
USACO 2009 Feb 股票市场 Stock Market Description 尽管奶牛们天生谨慎,她们仍然在住房抵押信贷市场中大受打击,现在她们准备在股市 上碰碰运气.贝西开挂了,她知道S ...
- 洛谷P2903 [USACO08MAR]麻烦的干草打包机The Loathesome Hay Baler
P2903 [USACO08MAR]麻烦的干草打包机The Loathesome Hay Baler 题目描述 Farmer John has purchased the world's most l ...
- 【Usaco 2009 Gold】JZOJ2020年9月19日提高B组T4 过路费
[Usaco 2009 Gold]JZOJ2020年9月19日提高B组T4 过路费 题目 Description 跟所有人一样,农夫约翰以着宁教我负天下牛,休叫天下牛负我的伟大精神,日日夜夜苦思生财之 ...
随机推荐
- C# vb .net图像合成-合成艺术字 照片合成艺术字
在.net中,如何简单快捷地实现图像合成呢,比如合成文字,合成艺术字,多张图片叠加合成等等?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码 ...
- Kubernetes(K8s)基础知识(docker容器技术)
今天谈谈K8s基础知识关键词: 一个目标:容器操作:两地三中心:四层服务发现:五种Pod共享资源:六个CNI常用插件:七层负载均衡:八种隔离维度:九个网络模型原则:十类IP地址:百级产品线:千级物理机 ...
- Mybatis中使用association进行关联的几种方式
这里以一对一单向关联为例.对使用或不使用association的配置进行举例. 实体类: @Data @ToString @NoArgsConstructor public class IdCard ...
- TCP三次握手四次挥手介绍
学过计算机网络的同学都知道TCP协议是计算机网络课程里面最复杂的协议之一,还没有通信就要搞个什么三次握手,断开还要什么四次分手,中间还要什么流量控制啦,拥塞控制,滑动窗口什么的,初学者看了就会头晕. ...
- 【OGG】RAC环境下配置OGG单向同步 (四)
[OGG]RAC环境下配置OGG单向同步 (四) 一.1 BLOG文档结构图 一.2 前言部分 一.2.1 导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的 ...
- day 03 作业 预科
目录 作业 1.简述变量的组成 2.简述变量名的命名规范 3.简述注释的作用 4.使用turtle库构造一幅图,贴在markdown文档中 作业 1.简述变量的组成 变量由变量名.赋值符号.变量值所组 ...
- Gtest:源码解析
转自:玩转Google开源C++单元测试框架Google Test系列(gtest)之七 - 深入解析gtest 一.前言 “深入解析”对我来说的确有些难度,所以我尽量将我学习到和观察到的gtest内 ...
- php string常用函数
<?php $a[]='a'; $a[]='b'; $a[]='C'; echo "</br>"; /* implode — 将一个一维数组的值转化为字符串 说明 ...
- Codeforces B. Mouse Hunt(强连通分解缩点)
题目描述: Mouse Hunt time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- Mybatis容易遇到的问题
1.MyBatis中#和$的区别? 1.使用#的原理是?占位符,而$的原理为直接字符串拼接方式 2.$方式一般使用在写数据库中的固定字段时候才会使用例如表名或者列名(select * from use ...