干草金字塔

干草金字塔

时间限制: 1 Sec  内存限制: 128 MB

题目描述

贝西要用干草包堆出一座金字塔。干草包会从传送带上陆续运来,依次出现 N 包,每包干草可

以看做是一个二维平面上的一个长方形,第 i 包干草的宽度是 W i ,长度统一为 1。

金字塔的修建有几个规定,首先,为了建筑稳定,塔一定要形成类似“金”字的样子,即塔的上

层宽度不能超过下层宽度,而且每层的干草包必须紧靠在一起,不能出现缝隙。其次,由于干草是陆

续送来的,所以先送来的干草放在较低层。贝西会选择最先送来的几包干草,堆在地上作为第一层,

然后再把紧接着送来的几包干草包放在第二层,再铺建第三层……重复这个过程,一直到所有的干草

全部用完。最后,贝西不喜欢浪费,所有干草包一定要用上,不能弃置不用。贝西的目标是建一座最

高的金字塔,在遵循上述规定的前提下,她可以任意决定在金字塔的每一层布置多少连续的干草包。

请你来帮助她完成这个任务吧。

输入

? 第一行:单个整数 N,1 ≤ N ≤ 100000

? 第二行到第 N + 1 行:第 i + 1 行有一个整数 W i ,1 ≤ W i ≤ 10000

输出

? 单个整数:表示可以建成的最高高度

样例输入

3

1

2

3

样例输出

2

提示

将 1 和 2 放在第一层,将 3 放在第二层

题解:

首先因为这道题从下到上会有后效性,所以可以想到从上到下堆,f[i]表示后i个干草能够达到的最大高度。

于是很容易想到暴力,每次j向后枚举就可以了,但是n≤100000,O(n^2)肯定会超时,所以考虑优化。

定义sum[i]为前缀和,g[i]表示后i个堆到f[i]高度时(实际上就是达到最大高度时)最后一层的最小宽度。

sum[i]和f[i]都是递增的,g[i]相对于上一个状态也是递增的。因此我们只需要找到使g[i]变化量最小的值就可以了。

为什么是最小值?很显然,把后i个干草堆想象成一个面积为sum[i]的金字塔,那么要使f[i]尽可能的大,g[i]就要尽可能的小。

接下来是怎么找,很显然g[i]相对与g[j]的变化量为s=sum[i]-sum[j]-g[j]=sum[i]-(sum[j]+g[j]),要使s最大,sum[j]+g[j]要最小,显然sum[j]+g[j]与i没有关系,所以考虑使用优先队列保存sum[j]+g[j]的值,每次取小于sum[i]的最大值就可以了。

因为sum[i]是递增的,所以当存在另一个比sum[i]小的更大的值时,前面的就可以出队了。

AC代码如下:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<stack>
#include<ctime>
#include<vector>
using namespace std;
int n,f[100001],a[100001],sum[100001],g[100001],s[100001];
int q[100001],head,tail;
int main()
{
    int i,j;
    scanf("%d",&n);
    for(i=n;i>=1;i--)
    {
        scanf("%d",&a[i]);
    }
    for(i=1;i<=n;i++)
    {
        sum[i]=sum[i-1]+a[i];
    }
    q[tail++]=0;
    for(i=1;i<=n;i++)
    {
        while(head+1<tail&&s[q[head+1]]<=sum[i])head++;
        f[i]=f[q[head]]+1;
        g[i]=g[q[head]]+sum[i]-s[q[head]];
        s[i]=sum[i]+g[i];
        while(tail>head&&s[q[tail-1]]>s[i])tail--;
        q[tail++]=i;
    }
    cout<<f[n];
    return 0;
}
时间: 2024-08-28 23:21:37

干草金字塔的相关文章

《金字塔原理》听书笔记

<金字塔原理>已经畅销 40 多年,不仅是麦肯锡经典培训教材,甚至成为了整个咨询业的标准,并被众多国际知名企业和世界知名院校用来进行员工培训内容.本书提供了关于思考和表达技巧的重要观念,帮助你强化思考架构能力和逻辑沟通能力,让你更高效地思考.表达和解决问题. 芭芭拉 · 明托,毕业于哈佛大学,是麦肯锡咨询公司第一位女咨询顾问.她在写作方面的优势得到了麦肯锡高层的赏识,由此负责提高麦肯锡公司员工的写作能力,并致力于探索条理清晰的文章所必需的思维结构.明托传授金字塔原理 40 年,帮助政府.企业.

Python图像处理(16):图像金字塔

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 图像金字塔是图像中多尺度表达的一种,最初用于机器视觉和图像压缩.一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合.其通过梯次向下采样获得,直到达到某个终止条件才停止采样.金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率的近似.层级越高,则图像越小,分辨率越低. 一般情况下有两种类型的图像金字塔常常出现在文献和以及实际运用中.他们分别是: 高斯金字塔

【练习5.11】图像分割、cvPyrSegmentagtion、图像金字塔

提纲 题目要求 程序代码 结果图片 要言妙道 题目要求: 载入一张风景图,执行cvPyrSegmentation操作 a.threshold1=threshold2=200 b.threshold1=200,threshold2=50 c.threshold1=200,threshold2=100 程序代码: 1 // OpenCVExerciseTesting.cpp : 定义控制台应用程序的入口点. 2 // 3 //D:\\Work\\Work_Programming\\Source\\I

[Usaco2008 Nov]Buying Hay 购买干草[背包]

Description 约翰的干草库存已经告罄,他打算为奶牛们采购日(1≤日≤50000)磅干草. 他知道N(1≤N≤100)个干草公司,现在用1到N给它们编号.第i个公司卖的干草包重量为Pi(1≤Pi≤5000)磅,需要的开销为Ci(l≤Ci≤5000)美元.每个干草公司的货源都十分充足,可以卖出无限多的干草包.    帮助约翰找到最小的开销来满足需要,即采购到至少H磅干草. Input 第1行输入N和日,之后N行每行输入一个Pi和Ci. Output 最小的开销. Sample Input

1.5.1 Number Triangles 数字金字塔

★1.5.1 Number Triangles 数字金字塔 一.题目描述 考虑在下面被显示的数字金字塔. 写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大. 每一步可以走到左下方的点也可以到达右下方的点. 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 在上面的样例中,从7 到 3 到 8 到 7 到 5 的路径产生了最大和:30 PROGRAM NAME: numtri 18 INPUT FORMAT 第一个行包含 R(1<= R<=1000) ,表示行的数目

[BZOJ] 1618: [Usaco2008 Nov]Buying Hay 购买干草

1618: [Usaco2008 Nov]Buying Hay 购买干草 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1216  Solved: 633[Submit][Status][Discuss] Description 约翰的干草库存已经告罄,他打算为奶牛们采购H(1≤H≤50000)磅干草,他知道N(1≤N≤100)个干草公司,现在用1到 N给它们编号.第i个公司卖的干草包重量为Pi(1≤Pi≤5000)磅,需要的开销为Ci(l≤Ci≤5

谈谈企业的数据工作!——企业的数据分析能力金字塔

写在前面 笔者写这篇文章的初衷源于两个故事: 故事一:一位在互联网行业做数据库架构多年的同事一起吃饭,问起我现在在说什么,我说自己在做医疗方面数据分析,同事笑,说:你有很多资源啊,只要你能拿到电子病例的数据,就能分析很多东西了--我脸上的微笑表情瞬间僵化! 故事二:当时为内蒙一个企业做上游原材料供应商的数据管理项目,当时我们拿到的只是该企业小部分供应商的数据,下一阶段计划拿到其全国供应商的相关数据给该企业进行管理支持.有一天,我们的项目负责人很兴奋,高兴地对我说:后面我们拿到所有供应商的数据后,

[bzoj1618][Usaco2008 Nov]购买干草

Description 约翰的干草库存已经告罄,他打算为奶牛们采购磅干草. 他知道个干草公司,现在用1到给它们编号.第个公司卖的干草包重量为磅,需要的开销为美元.每个干草公司的货源都十分充足,可以卖出无限多的干草包. 帮助约翰找到最小的开销来满足需要,即采购到至少磅干草. Input 第1行输入和. 接下来N行每行输入一个和. Output 一行一个整数,表示最小的开销. Sample Input 2 15 3 2 5 3 Sample Output 9 HINT Solution 裸的完全背包

Spatial pyramid pooling (SPP)-net (空间金字塔池化)笔记(转)

在学习r-cnn系列时,一直看到SPP-net的身影,许多有疑问的地方在这篇论文里找到了答案. 论文:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition 转自:http://blog.csdn.net/xzzppp/article/details/51377731 另可参考:http://zhangliliang.com/2014/09/13/paper-note-sppnet/ http:/