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相关推荐

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

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

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

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

  3. Bzoj1233 [Usaco2009Open]干草堆tower

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

  4. 【BZOJ 1233】 干草堆

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

  5. [bzoj1233]干草堆tower

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

  6. bzoj 1233 干草堆tower 优先队列优化dp

    https://www.lydsy.com/JudgeOnline/problem.php?id=1233 描述: 奶牛们讨厌黑暗. 为了调整牛棚顶的电灯的亮度,Bessie必须建一座干草堆使得她能够 ...

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

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

  8. 2041. 干草堆(前缀和差分)

    2041. 干草堆 题目 提交记录 讨论 题解 视频讲解 贝茜对她最近在农场周围造成的一切恶作剧感到抱歉,她同意帮助农夫约翰把一批新到的干草捆堆起来. 开始时,共有 NN 个空干草堆,编号 1∼N1∼ ...

  9. AcWing每日一题2041. 干草堆

    AcWing每日一题2041. 干草堆 题目描述 贝茜对她最近在农场周围造成的一切恶作剧感到抱歉,她同意帮助农夫约翰把一批新到的干草捆堆起来. 开始时,共有 N 个空干草堆,编号 1∼N. 约翰给贝茜 ...

最新文章

  1. 卫星轨道推演计算相关知识点总结(含欧拉角、旋转矩阵、及各坐标系转化等)
  2. mybatisplus修改单个属性_Mybatis Plus 中 参数传递的优化之路
  3. Quartus II常见问题集锦
  4. 重写、重构、重载区别
  5. 面向非易失内存的MPI-IO接口优化
  6. 2016物联网大趋势搞不懂?别担心,CES为你指点迷津
  7. (20)FPGA多路选择器设计(第4天)
  8. JAVA 正则表达式4种常用的功能
  9. idea exclude from compile 再加回来
  10. 架构师接龙 飞信孙朝晖VS.139说客李祎
  11. PetaLinux 添加启动后自动执行脚本
  12. 常用1寸,2寸照片标准尺寸
  13. iPhone怎么设置闹钟铃声?苹果手机自定义闹钟铃声教程
  14. MacBook Pro键盘功能盘点
  15. 窄带包络Matlab分析,窄带随机过程的产生及其性能测试
  16. 关于“男孩出剪刀,女孩出布”,你怎么看,你又会怎么选择?
  17. Ackerman函数 非递归 java_ackerman(ackerman是谁)
  18. 【Java】保留两位小数(不四舍五入)
  19. dataframe 按条件筛选行
  20. 36氪2022年Q3总收入同比增长两位数超预期,连续第四个季度盈利,广告收入同比增长20%

热门文章

  1. 手机号登录和微信登录
  2. Android Studio 连接雷电模拟器
  3. AI芯片:寒武纪DaDianNao结构分析
  4. 【Atlas 200 DK】(一)简介 Atlas 200 DK 开发者套件(型号:3000)
  5. 小米面试题:手机分身,电话号码隐藏。
  6. echarts柱状图多组数据配置
  7. Unity3d制作简单拼图游戏
  8. SVN如何对已经提交的注释进行再次修改?
  9. Win10/UWP 扫描二维码
  10. 必看!Salesforce管理员职场如何快速晋升?