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. JavaScript--阻止事件冒泡stopPropagation和cancelBubble

    <!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/html"> ...

  2. 转载 初探Promise

    初探Promise https://segmentfault.com/a/1190000007032448 javascript es6 promise 33.5k 次阅读  ·  读完需要 65 分 ...

  3. php Laravel Thrift使用TMultiplexedProcessor复用端口模式

    thrift的使用中一般是一个Server对应一个Processor和一个Transport,如果有多个服务的话,那必须要启动多个Server,占用多个端口,这种方式显然不是我们想要的,所以thrif ...

  4. 大数据技术之Hadoop(MapReduce)

    第1章 MapReduce概述 1.1 MapReduce定义 1.2 MapReduce优缺点 1.2.1 优点 1.2.2 缺点 1.3 MapReduce核心思想 MapReduce核心编程思想 ...

  5. Directx11教程(33) 纹理映射(3)

    原文:Directx11教程(33) 纹理映射(3)       现在我们在myTutorialD3D11_5的基础上,来逐步编码实现纹理映射,之所以在myTutorialD3D11_5基础上改写,是 ...

  6. python中Sting字符串

    字符串连接 方法1: 用字符串的join方法 a = ['a','b','c','d'] content = '' content = ''.join(a) print content 方法2: 用字 ...

  7. 小爬爬7:回顾&&crawlSpider

    1.回顾昨日内容 回顾 - 全站数据爬取(分页) - 手动请求的发送Request(url,callback) - post请求和cookie处理 - start_requests(self) - F ...

  8. hdu1527 威佐夫博奕

    有2堆石子,有2个人,每个人可以从一堆取或从2堆取一样的个数的石子,至少取1个.问先手的是胜或输.设(ak,bk)我么成为局势. (0,0)(1,2)(3,5)(4,7)..这种先手必输的叫奇异局势. ...

  9. 2019-8-31-dotnet-控制台-Hangfire-后台定时任务

    title author date CreateTime categories dotnet 控制台 Hangfire 后台定时任务 lindexi 2019-08-31 16:55:58 +0800 ...

  10. Java练习 SDUT-1255_小明A+B

    小明A+B Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 小明今年3岁了, 现在他已经能够认识100以内的非负整数, ...