[POI 2008&洛谷P3467]PLA-Postering

Description

Byteburg市东边的建筑都是以旧结构形式建造的:建筑互相紧挨着,之间没有空间.它们共同形成了一条长长的,从东向西延伸的建筑物链(建筑物的高度不一).

Byteburg市的市长Byteasar,决定将这个建筑物链的一侧用海报覆盖住.并且想用最少的海报数量,海报是矩形的.

海报与海报之间不能重叠,但是可以相互挨着(即它们具有公共边),每一个海报都必须贴近墙并且建筑物链的整个一侧必须被覆盖(意思是:海报需要将一侧全部覆盖,并且不能超出建筑物链)

输入格式:第一行为一个整数n(1≤n≤250000),表示有n个建筑,接下来n行中,第i行表示第i个建筑物的宽di与高wi(1≤di,wi≤1 000 000 000),中间由一个空格隔开;

输出格式:第一个为一个整数,表示最少需要几张海报覆盖整个建筑物.

Solution

1.考虑如果整个建筑物链是等高的,一张高为链高,宽为整个建筑物宽的海报即可完全覆盖;

2.若有两个不等高的元素组成建筑物链,那么一定需要两张;

3.因为题目要求海报不可超出建筑物链,那么我们即可用单调栈维护:初始海报数为建筑物数,入栈建筑物链的高度序列,当栈顶大于即将入栈元素时弹栈,若最后弹栈元素与即将入栈元素等高,需要的海报数-1;

4.易证明本方法是正确的:当有两个处于一个峰两侧的等高块时,他们可以用一张海报覆盖,所需海报数显然可减少一个;

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
long long top=0,n,num=0,i,j,k,stack[250100];
int main(){
scanf("%lld",&n);
for(i=1;i<=n;++i){
scanf("%lld%lld",&j,&k);
while(top>0&&k<=stack[top]){
if(k==stack[top])num++;
--top;
}
stack[++top]=k;
}
printf("%lld\n",n-num);
return 0;
}

单调栈基础知识部分可以参考我的题解:http://www.cnblogs.com/COLIN-LIGHTNING/p/8474668.html

最新文章

  1. WWDC2016 观后杂感
  2. 在C#代码中应用Log4Net(四)在Winform和Web中捕获全局异常
  3. 《javascript高级程序设计》第三章学习笔记
  4. Power-BI 预警触发的设定
  5. poj 1611 The Suspects 解题报告
  6. INTEL XDK 真机调试
  7. poj3307
  8. python代码打印行号,文件名
  9. PLSQL连接Oracle数据库,使用instantclient_10_2客户端
  10. LeetCodeOJ. String to Integer (atoi)
  11. Sails.js中文文档
  12. 使用axis2访问webservice(webserivice基于.net平台实现)
  13. CLAHE的实现和研究
  14. 在TFS中通过程序动态创建Bug并感知Bug解决状态
  15. 高性能缓存系统Memcached在ASP.NET MVC中应用
  16. 跟angular2学一键开启项目--关于上个react-redux项目的一键调试
  17. Coursera机器学习+deeplearning.ai+斯坦福CS231n
  18. Zookeeper系列四:Zookeeper实现分布式锁、Zookeeper实现配置中心
  19. SOA,SOAP,RPC,以及 RPC协议与 REST 协议之间的关系(搜狗)
  20. #define后面只带有一个标识符

热门文章

  1. 对scrum站立会议的理解
  2. php多维数组排序 3
  3. Hibernate 中 load() 方法导致的 noSession 异常
  4. hdu-题目:1058 Humble Numbes
  5. 【C++】不要在构造函数或析构函数内调用虚函数
  6. TCP建立连接与释放连接过程中的几个问题
  7. adb命令模拟按键事件KeyCode
  8. Struts按着配置文件的加载的顺序,后面文件和前面文件相同的配置,后面的会把前面的文件的值覆盖
  9. BZOJ4881 线段游戏(二分图+树状数组/动态规划+线段树)
  10. Android开发性能优化总结(一)