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的更多相关文章

  1. USACO 2009 Open 干草塔 Tower of Hay(贪心+单调队列优化DP)

    https://ac.nowcoder.com/acm/contest/1072/B Description 为了调整电灯亮度,贝西要用干草包堆出一座塔,然后爬到牛棚顶去把灯泡换掉.干草包会从传送带上 ...

  2. [USACO09Open] Tower of Hay 干草塔

    为了调整电灯亮度,贝西要用干草包堆出一座塔,然后爬到牛棚顶去把灯泡换掉.干草包会从传送带上运来,共会出现N包干草,第i包干草的宽度是W i ,高度和长度统一为1.干草塔要从底层开始铺建.贝西会选择最先 ...

  3. 【BZOJ 1233】 [Usaco2009Open]干草堆tower (单调队列优化DP)

    1233: [Usaco2009Open]干草堆tower Description 奶牛们讨厌黑暗. 为了调整牛棚顶的电灯的亮度,Bessie必须建一座干草堆使得她能够爬上去够到灯泡 .一共有N大包的 ...

  4. bzoj1233[Usaco2009Open]干草堆tower 单调队列优化dp

    1233: [Usaco2009Open]干草堆tower Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 983  Solved: 464[Submi ...

  5. bzoj1615 / P2903 [USACO08MAR]麻烦的干草打包机The Loathesome Hay Baler

    P2903 [USACO08MAR]麻烦的干草打包机The Loathesome Hay Baler 细节题.$O(n^{2})$的$bfs$可过. #include<iostream> ...

  6. bzoj 1233: [Usaco2009Open]干草堆tower

    1233: [Usaco2009Open]干草堆tower Description 奶牛们讨厌黑暗. 为了调整牛棚顶的电灯的亮度,Bessie必须建一座干草堆使得她能够爬上去够到灯泡 .一共有N大包的 ...

  7. USACO 2009 Feb 股票市场 Stock Market

    USACO 2009 Feb 股票市场 Stock Market Description 尽管奶牛们天生谨慎,她们仍然在住房抵押信贷市场中大受打击,现在她们准备在股市 上碰碰运气.贝西开挂了,她知道S ...

  8. 洛谷P2903 [USACO08MAR]麻烦的干草打包机The Loathesome Hay Baler

    P2903 [USACO08MAR]麻烦的干草打包机The Loathesome Hay Baler 题目描述 Farmer John has purchased the world's most l ...

  9. 【Usaco 2009 Gold】JZOJ2020年9月19日提高B组T4 过路费

    [Usaco 2009 Gold]JZOJ2020年9月19日提高B组T4 过路费 题目 Description 跟所有人一样,农夫约翰以着宁教我负天下牛,休叫天下牛负我的伟大精神,日日夜夜苦思生财之 ...

随机推荐

  1. 4、线程池(摘自C#高级编程第7版)

    1.需求背景 创建线程需要时间.如果有不同的小任务完成,就可以事先创建许多线程,在应完成这些任务时发出请求.这个线程数最好在需要更多的线程时增加,在需要释放资源时减少.   2.线程池出场 不需要自己 ...

  2. HTTP协议的认识

    1.内容回顾 1.HTTP协议消息的格式: 1.请求(request) 请求方法 路径 HTTP/1.1 \r\n k1:v1\r\n ...\r\n \r\n 请求体 <--这里可以有可以没有 ...

  3. Github下载慢和下载过程中断等情况的解决方案

    Github下载慢和下载过程中断等情况的解决方案   最近老大push项目,正常的git clone每次都是下载一部分就断掉了. 尝试了修改hosts文件的方式,更换了延迟最低的域名也没啥用(难道我姿 ...

  4. 谈谈MySQL中的锁

    谈谈MySQL中的锁 锁的定义 ​ 在生活中锁的例子就非常多了,所以应该很容易理解锁的含义.在计算机领域,可以这样来概述,锁是计算机协调多个进行进程并发访问某一资源的机制. ​ 在数据库中,锁也是一个 ...

  5. Java的基本知识之线程池篇

    1.基本概念 1.共享资源 多个线程对同一份资源进行访问(读写操作),该资源被称为共享资源.如何保证多个线程访问到的数据是一致的,则被称为数据同步或资源同步. 2.线程通信 线程通信,又叫进程内通信, ...

  6. printk打印级别

    默认级别 # cat /proc/sys/kernel/printk 4 4 1 7 分别是:控制台日志级别.默认的消息日志级别.最低的控制台日志级别和默认的控制台日志级别 举例 # echo 0 & ...

  7. .net 获取CPU频率 内存 磁盘大小,域名 端口 虚拟目录等

    CPU个数: @Environment.GetEnvironmentVariable("NUMBER_OF_PROCESSORS") CPU类型: @Environment.Get ...

  8. SQL进阶系列之6用关联子查询比较行与行

    写在前面 使用SQL对同一行数据进行列间的比较很简单,只需要在WHERE子句里写上比较条件就可以了,对于不同行数据进行列间比较需要使用自关联子查询. 增长.减少.维持现状 需要用到行间比较的经典场景是 ...

  9. 使用Arduino开发板连接干簧管(Reed Switch)的方法

    在现实生活中,干簧管(Reed Switch)有许多重要的应用,如磁性门开关.笔记本电脑.智能手机等.在本篇文章中,我们将了解一些干簧管的知识,并介绍如何使用Arduino开发板连接干簧管. 干簧管( ...

  10. ASP.NET Core 类库中取读配置文件 appsettings.json

    首先引用NuGet包 Microsoft.Extensions.Configuration Microsoft.Extensions.Configuration.Json Microsoft.Exte ...