zoukankan      html  css  js  c++  java
  • BZOJ1113 海报PLA

    好像是很古老的题?现在BZOJ上找不到该题,所以没有提交。

    1113: [Poi2008]海报PLA

    Time Limit: 10 Sec  Memory Limit: 162 MB
    Submit: 810  Solved: 507
    [Submit][Status][Discuss]

    Description

    N个矩形,排成一排. 现在希望用尽量少的矩形海报Cover住它们.

    (SilverN附注:矩形外不能贴海报)

    Input

    第一行给出数字N,代表有N个矩形.N在[1,250000] 下面N行,每行给出矩形的长与宽.其值在[1,1000000000]2 1/2 Postering

    Output

    最少数量的海报数.

    Sample Input

    5
    1 2
    1 3
    2 2
    2 5
    1 4

    Sample Output

    4

    根据神秘提示 可以用单调栈来处理。

    先假设每个矩形都用一张海报覆盖。从左到右遍历,对于一个矩形,如果左边有和它高度相等的矩形(且两个矩形之间没有更低的),那么可以用一大张海报覆盖这两个矩形和它们之间的部分(见上图),则总海报数-- 。

    用单调栈维护“左边第一个比当前矩形低的矩形”,如果该矩形高度和当前矩形相同,那么总海报数--

    代码如下:

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cmath>
     4 using namespace std;
     5 int n;
     6 int st[2000];
     7 int t=0;
     8 int ans;
     9 int main(){
    10     scanf("%d",&n);
    11     ans=n;//最差情况需要n张海报 
    12     int i,j;
    13     int x,y;
    14     scanf("%d%d",&x,&y);
    15     st[++t]=y;
    16     for(i=2;i<=n;i++){
    17         scanf("%d%d",&x,&y);
    18         while(t>0 && st[t]>y)t--;
    19         if(st[t]==y)ans--;
    20         st[++t]=y;
    21     }
    22     printf("%d
    ",ans);
    23     return 0;
    24 
    25 }
  • 相关阅读:
    JavaScript 教程
    C#基础实例
    Angularjs实例5
    Angularjs实例4
    Angularjs 数据过滤
    Angularjs实例3
    Angularjs 数据循环
    Angularjs模块
    Angularjs 数据双向绑定
    Angularjs实例应用
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/5550631.html
Copyright © 2011-2022 走看看