bzoj-1233 [Usaco2009Open]干草堆tower
1233: [Usaco2009Open]干草堆tower**
题目链接
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 1030 Solved: 494
[Submit][Status][Discuss]
Description
奶牛们讨厌黑暗。 为了调整牛棚顶的电灯的亮度,Bessie必须建一座干草堆使得她能够爬上去够到灯泡 。一共有N大包的干草(1<=N<=100000)(从1到N编号)依靠传送带连续的传输进牛棚来。第i包干草有一个 宽度W_i(1<=w_i<=10000)。所有的干草包的厚度和高度都为1. Bessie必须利用所有N包干草来建立起干草堆,并且按照他们进牛棚的顺序摆放。她可以相放多少包就放 多少包来建立起tower的地基(当然是紧紧的放在一行中)。接下来他可以放置下一个草包放在之前一级 的上方来建立新的一级。注意:每一级不能比下面的一级宽。她持续的这么放置,直到所有的草包都被安 置完成。她必须按顺序堆放,按照草包进入牛棚的顺序。说得更清楚一些:一旦她将一个草包放在第二级 ,她不能将接下来的草包放在地基上。 Bessie的目标是建立起最高的草包堆。
Input
第1行:一个单一的整数N。 第2~N+1行:一个单一的整数:W_i。
Output
第一行:一个单一的整数,表示Bessie可以建立的草包堆的最高高度。
Sample Input
3
1
2
3
Sample Output
2
输出说明:
前两个(宽度为1和2的)放在底层,总宽度为3,在第二层放置宽度为3的。
+----------+| 3 |+---+------+| 1 | 2 |+---+------+
HINT
Source
题解
刚开始还以为是二分之类……
我们感性理解可以得到这样一个结论:对于最优放按,每层肯定都是达到满足的条件且最小的。
我们倒过来构造,每一层都要 ≥≥\geq 上一层,因此,最高层要尽可能小,接下来每一层都同理。但是直接如果贪心每一层都都直接取能取到的最小值,会有问题,反例:
输入
5
9 7 2 1 7
输出
4
底层 9 第二层 7+2 第三层 1+7 ,贪心的话最高层会直接放上 7,那么最多只能叠两层。
我们考虑 DP。(注意:读入的 WiWiW_i 已经翻转过并构造前缀和 sumisumisum_i)
定义 g[i]g[i]g[i] 和 f[i]f[i]f[i] 分别表示前 i 块砖最多能叠的层数,以及这一层最窄的宽度。
我们可以 N2N2N^2 来求,但是太慢了。
设 k<j<ik<j<i k 且从 jjj 转移到 i" role="presentation" style="position: relative;">iii,比 kkk 转移到 i" role="presentation" style="position: relative;">iii 更优秀,那么一定有以下两条性质:
①f[j]≥sum[i]−sum[j]f[j]≥sum[i]−sum[j]f[j] \ge sum[i] - sum[j] 因为 f[i]=sum[i]−sum[t]f[i]=sum[i]−sum[t]f[i] = sum[i] - sum[t](ttt为上一状态)
也就是 f[j]+sum[j]" role="presentation" style="position: relative;">f[j]+sum[j]f[j]+sum[j]f[j]+sum[j] 的值越大,能转移到的状态就越多。
②f[k]+sum[k]≤f[j]+sum[j]f[k]+sum[k]≤f[j]+sum[j]f[k]+sum[k] \le f[j]+sum[j] 为了使得当前这层的宽度最小,上一状态要尽可能靠后,同时满足条件①。
如果有一个很靠后的状态而且满足条件①,那么之前的状态一定没有这个状态优秀(转移后效果更优秀,且能转移到的范围更大,jjj 自然比 k" role="presentation" style="position: relative;">kkk 好,所以留着 kkk 就没有意义了)。
所以我们可以用单调队列来维护一个最优秀的上一状态,达到 O(1)" role="presentation" style="position: relative;">O(1)O(1)O(1) 转移,那么时间复杂度就优化到了 O(N)O(N)O(N)。
代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define LL long long
using namespace std;
const int maxn=1e5+5;
int n,g[maxn],q[maxn],til,hea,s[maxn],f[maxn];
int rad()
{int ret=0,f=1;char ch=getchar();while (ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();}while (ch>='0'&&ch<='9') ret=ret*10+ch-'0',ch=getchar();return ret*f;
}
int main()
{n=rad();for (int i=n;i>=1;--i) s[i]=rad();for (int i=1;i<=n;i++) s[i]+=s[i-1];for (int i=1;i<=n;i++){while (hea<til&&s[i]>=f[q[hea+1]]+s[q[hea+1]]) ++hea;q[++til]=i;f[i]=s[i]-s[q[hea]];g[i]=g[q[hea]]+1;while (hea<til&&s[q[til]]+f[q[til]]<=s[q[til-1]]+f[q[til-1]]) q[til-1]=q[til--];}printf("%d\n",g[n]);return 0;
}
bzoj-1233 [Usaco2009Open]干草堆tower相关推荐
- bzoj 1233: [Usaco2009Open]干草堆tower【dp+单调栈】
参考:https://www.cnblogs.com/N-C-Derek/archive/2012/07/11/usaco_09_open_tower.html 虽然长得很像斜率优化,但是应该不算-- ...
- [BZOJ1233][Usaco2009Open]干草堆tower(单调队列优化)
传送门 题意搞skr人-,其实就是堆方块: 有n(n<=100000)个干草,每堆有个宽度,现在要且分成若干段,把每一段的干草按顺序堆起来形成一个多层的干草堆(所以下标越小的干草堆放在越下面)且 ...
- Bzoj1233 [Usaco2009Open]干草堆tower
Time Limit: 10 Sec Memory Limit: 162 MB Submit: 811 Solved: 378 Description 奶牛们讨厌黑暗. 为了调整牛棚顶的电灯的亮度 ...
- 【BZOJ 1233】 干草堆
[题目链接] 点击打开链接 [算法] 这题有一个性质 : 位于顶层的干草堆可以满足宽度最小且高度最高 根据这个性质,用单调队列优化DP,即可 [代码] #include<bits/stdc++. ...
- [bzoj1233]干草堆tower
[bzoj1233]干草堆tower 首先,倒着直接贪心是会被卡的 数据如下: 6 11 10 7 3 2 6 然后我们可以发现一些性质:每个点取能取的最小的宽度,这样一定能构成最优解 然后状态是f[ ...
- bzoj 1233 干草堆tower 优先队列优化dp
https://www.lydsy.com/JudgeOnline/problem.php?id=1233 描述: 奶牛们讨厌黑暗. 为了调整牛棚顶的电灯的亮度,Bessie必须建一座干草堆使得她能够 ...
- BZOJ 1233 干草堆 (单调队列优化DP)
\(BZOJ~1233~~\)干草堆: (题目特殊性质) \(solution:\) 很妙的一道题目,开始看了一眼觉得是个傻逼贪心,从后往前当前层能多短就多短,尽量节省花费.但是这是DP专题,怎么会有 ...
- 2041. 干草堆(前缀和差分)
2041. 干草堆 题目 提交记录 讨论 题解 视频讲解 贝茜对她最近在农场周围造成的一切恶作剧感到抱歉,她同意帮助农夫约翰把一批新到的干草捆堆起来. 开始时,共有 NN 个空干草堆,编号 1∼N1∼ ...
- AcWing每日一题2041. 干草堆
AcWing每日一题2041. 干草堆 题目描述 贝茜对她最近在农场周围造成的一切恶作剧感到抱歉,她同意帮助农夫约翰把一批新到的干草捆堆起来. 开始时,共有 N 个空干草堆,编号 1∼N. 约翰给贝茜 ...
最新文章
- 卫星轨道推演计算相关知识点总结(含欧拉角、旋转矩阵、及各坐标系转化等)
- mybatisplus修改单个属性_Mybatis Plus 中 参数传递的优化之路
- Quartus II常见问题集锦
- 重写、重构、重载区别
- 面向非易失内存的MPI-IO接口优化
- 2016物联网大趋势搞不懂?别担心,CES为你指点迷津
- (20)FPGA多路选择器设计(第4天)
- JAVA 正则表达式4种常用的功能
- idea exclude from compile 再加回来
- 架构师接龙 飞信孙朝晖VS.139说客李祎
- PetaLinux 添加启动后自动执行脚本
- 常用1寸,2寸照片标准尺寸
- iPhone怎么设置闹钟铃声?苹果手机自定义闹钟铃声教程
- MacBook Pro键盘功能盘点
- 窄带包络Matlab分析,窄带随机过程的产生及其性能测试
- 关于“男孩出剪刀,女孩出布”,你怎么看,你又会怎么选择?
- Ackerman函数 非递归 java_ackerman(ackerman是谁)
- 【Java】保留两位小数(不四舍五入)
- dataframe 按条件筛选行
- 36氪2022年Q3总收入同比增长两位数超预期,连续第四个季度盈利,广告收入同比增长20%