• Bzoj1233 [Usaco2009Open]干草堆tower


    Time Limit: 10 Sec  Memory Limit: 162 MB
    Submit: 811  Solved: 378

    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

    单调队列优化DP

    要满足解最优,每次加草堆时,原有堆的底层宽度应该尽量小。

    设f[i]表示将第i~n个干草堆全使用以后,堆底层的最小宽度。

    得到DP方程:  f[i]=min(f[i],sum[j-]-sum[i-1]) ,要求满足sum[j-]-sum[i-1]>=f[j]

    每堆叠一层,高度就可以+1

    然而O(n^2)复杂度爆炸,需要单调队列优化。

     1 /*By SilverN*/
     2 #include<iostream>
     3 #include<cstdio>
     4 #include<algorithm>
     5 #include<cstring>
     6 #include<cmath>
     7 using namespace std;
     8 const int mxn=100010;
     9 int read(){
    10     int x=0,f=1;char ch=getchar();
    11     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    12     while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
    13     return x*f;
    14 }
    15 int n;
    16 int w[mxn];
    17 int smm[mxn];
    18 int q[mxn],hd,tl;
    19 int f[mxn],h[mxn];
    20 int main(){
    21     int i,j;
    22     n=read();
    23     for(i=1;i<=n;i++)w[i]=read();
    24     for(i=1;i<=n;i++){smm[i]=smm[i-1]+w[i];}
    25     hd=tl=1;
    26     q[hd]=n+1;
    27     for(i=n;i;--i){
    28         while(hd<tl && smm[q[hd+1]-1]-smm[i-1]>=f[q[hd+1]])hd++;
    29         f[i]=smm[q[hd]-1]-smm[i-1];
    30         h[i]=h[q[hd]]+1;
    31         while(hd<tl && f[i]-smm[i-1]<f[q[tl]]-smm[q[tl]-1])tl--;
    32         q[++tl]=i;
    33     }
    34     printf("%d
    ",h[1]);
    35     return 0;
    36 }
  • 相关阅读:
    Office2010中功能强大的图片背景删除工具
    ArcGIS 缓冲区单位转换问题
    ArcGIS Server 优化
    SQLSERVER 三值逻辑
    SQLSERVER 重置自增列
    ArcGIS 基于AO 实现的经纬度定位
    AO连接ArcGIS server 超时问题
    MySQL 1064 错误
    Socket 请求http 汉字编码问题
    Navicat创建存储过程
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/5974719.html
Copyright © 2020-2023  润新知