Time Limit: 1 second

Memory Limit: 128 MB

【问题描述】

有N个矩形,矩形的底边边长为1,且均在X轴上,高度给出,第i个矩形的高为h[i],例如h = [3, 2, 4, 2]的图形如下:

 你可以容易地发现,只需要3个矩形就能覆盖这个图形。 你的任务就是,输出最少需要几个矩形能覆盖这个图形。

【输入格式】

第一行一个整数N。接下来1行包含N个正整数,为h[i]。

【输出格式】

输出一个整数表示最少需要几个矩形能覆盖这个图形。

【数据规模】

对于所有数据,N<=100000,h[i] <= 100。 对于部分数据,N<=10; 对于部分数据,N<=100; 对于部分数据,N<=1000; 对于部分数据,h[i] <= 10;

Sample Input1

10
2 3 2 4 2 1 3 4 3 2

【题解】

像是题目给的那张图

会发现前3列。3 2 4无论如何都没有办法用少于3个矩形覆盖。

而第4列2确可以省掉一个。

因为我们可以横着用一条长的把第2列和第3列都覆盖到

假想一下旁边还有一个高度为2的。也同样可以覆盖掉。

但如果是这样却不能省

虽然1和4高度都为2.

但是你中间有比这两个2低的1.

这下你可没办法弄一个长长的矩形同时覆盖它们俩了。

事实上如果后面出现2或者3都没有可能节省了,因为1比2和3都矮,都和这种情况相似(即虽然前面有一样高度的但是没办法省一个矩形)。

由此。我们可以用栈来解决这个问题。

如果栈为空就把当前这个高度入栈。

否则。如果当前元素比栈顶元素高。则入栈。

否则一直退栈。直到满足当前元素比栈顶元素高或恰好等于栈顶元素。

如果恰好等于则不要入栈(表示省了一个矩形)。

最后统计入过栈的元素的个数。就是答案了。

【代码】

#include <cstdio>

int n,stack[100009] = {0},top = 0,num = 0;

void input_data()
{
scanf("%d",&n);
for (int i = 1;i <= n;i++)
{
int x;
scanf("%d",&x);
while (stack[top] > x) //如果比栈顶元素矮则一直退栈
top--;
if (stack[top]!=x) //如果和栈顶元素不一样(就是大于了)
{
stack[++top] = x; //入栈
num++; //答案递增。
}
}
} void output_ans()
{
printf("%d",num); //最后输出入过栈的元素个数。
} int main()
{
input_data();
output_ans();
return 0;
}

【u201】矩形覆盖的更多相关文章

  1. 【OpenJudge 1793】矩形覆盖

    http://noi.openjudge.cn/ch0405/1793/ 好虐的一道题啊. 看数据范围,一眼状压,然后调了好长时间QwQ 很容易想到覆盖的点数作为状态,我用状态i表示至少覆盖状态i表示 ...

  2. NOIP2002矩形覆盖[几何DFS]

    题目描述 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4(0,7),见图一. 这 ...

  3. bzoj 1185 旋转卡壳 最小矩形覆盖

    题目大意 就是求一个最小矩形覆盖,逆时针输出其上面的点 这里可以看出,那个最小的矩形覆盖必然有一条边经过其中凸包上的两个点,另外三条边必然至少经过其中一个点,而这样的每一个点逆时针走一遍都满足单调性 ...

  4. [剑指OFFER] 斐波那契数列- 跳台阶 变态跳台阶 矩形覆盖

    跳台阶 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. class Solution { public: int jumpFloor(int number) ...

  5. NOIP2002 矩形覆盖

    题四 矩形覆盖(存盘名NOIPG4) [问题描述]: 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2), ...

  6. UVA-11983-Weird Advertisement(线段树+扫描线)[求矩形覆盖K次以上的面积]

    题意: 求矩形覆盖K次以上的面积 分析: k很小,可以开K颗线段树,用sum[rt][i]来保存覆盖i次的区间和,K次以上全算K次 // File Name: 11983.cpp // Author: ...

  7. 【旋转卡壳+凸包】BZOJ1185:[HNOI2007]最小矩形覆盖

    1185: [HNOI2007]最小矩形覆盖 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 1945  Solve ...

  8. BZOJ:1185: [HNOI2007]最小矩形覆盖

    1185: [HNOI2007]最小矩形覆盖 这计算几何……果然很烦…… 发现自己不会旋转卡壳,补了下,然后发现求凸包也不会…… 凸包:找一个最左下的点,其他点按照与它连边的夹角排序,然后维护一个栈用 ...

  9. BZOJ 1185: [HNOI2007]最小矩形覆盖 [旋转卡壳]

    1185: [HNOI2007]最小矩形覆盖 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 1435  Solve ...

随机推荐

  1. Objectarx之分批存储相连实体

    void CCommonFuntion::BatchStorageEnt(AcDbObjectIdArray& inputId, std::vector<std::vector<A ...

  2. Java程序中如何使用事物

    在java操作数据库是,为了保证数据的一致性,比如转账操作,从一个账户减掉10元,在另一个账户加上10元. 在类中定义的成员属性(变量)不用赋初值,但在函数里头定义的变量就一定要赋初值. packag ...

  3. AGC029 E: Wandering TKHS

     E: Wandering TKHS - AtCoder Grand Contest 029 | AtCoder 分类讨论好题(也不太算分类讨论) 方法:感受过程手玩,考虑能不能提前预算一些东西,或者 ...

  4. Ui自动化测试框架

    为了提高我们的UI测试效率,我们引用Ui自动化测试框架,这里简单先描述一下,后续会详细补充: 了解一个测试框架,我们就需要了解一下源码,能看懂源码即可: 1.稳定先封装wait EC,电脑性能配置较好 ...

  5. C++异常相关

    使用异常处理,程序中独立开发的各部分能够就程序执行期间出现的问题相互通信,并处理这些问题.C++ 的异常处理中,需要由问题检测部分抛出一个对象给处理代码,通过这个对象的类型和内容,两个部分能够就出现了 ...

  6. python 内置函数补充 or 递归 or 二分法

    一.内置函数的补充 repr() 显示出字符串的官方表示形式 chr() print(chr(20013)) # 把数字编码转换成字符串 ord() print(ord('中')) # 20013 把 ...

  7. android 数据存储----android短信发送器之文件的读写(手机+SD卡)

    本文实践知识点有有三: 1.布局文件,android布局有相对布局,线性布局,绝对布局,表格布局,标签布局等.各个布局能够嵌套的.本文的布局文件就是线性布局的嵌套 <LinearLayout x ...

  8. 卸载ROS命令

    ROS有问题需要卸载只需输入以下命令: sudo apt-get purge ros-* sudo rm -rf /etc/ros

  9. Flask学习之六 个人资料和头像

    英文博客地址:http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-vi-profile-page-and-avatars ...

  10. Transformer的PyTorch实现

    Google 2017年的论文 Attention is all you need 阐释了什么叫做大道至简!该论文提出了Transformer模型,完全基于Attention mechanism,抛弃 ...