zoukankan      html  css  js  c++  java
  • poj2082 Terrible Sets

     1 #include<stdio.h>
     2 struct Node{ //定义堆栈 
     3     int w,h; //w为目前为止整个区域的宽度,h为当前矩形的高度 
     4 }stack[50001];
     5 int main()
     6 {
     7     int i,n,top,totalw;  //top为栈顶指针,totalw为总的宽度 
     8     int curw,curh,maxsize; //curw,curh为新矩形高度,宽度。maxsize为当前最大矩形面积 
     9     while(scanf("%d",&n),n+1)
    10     {
    11         for(totalw=top=maxsize=i=0;i<n;++i)
    12         {
    13             scanf("%d%d",&curw,&curh);
    14             while(top&&curh<stack[top].h)//如果新矩形高小于栈顶元素高,则退栈 
    15             {
    16                 if(maxsize<((totalw-stack[top-1].w)*stack[top].h))
    17                     maxsize=(totalw-stack[top-1].w)*stack[top].h;
    18                 top--;
    19             }
    20             totalw+=curw;  //总宽度加curw 
    21             top++;
    22             stack[top].w=totalw;  //新矩形入栈 
    23             stack[top].h=curh;
    24         }
    25         while(top)  //处理栈中剩余矩形 
    26         {
    27             if(maxsize<((totalw-stack[top-1].w)*stack[top].h))
    28                 maxsize=(totalw-stack[top-1].w)*stack[top].h;
    29             top--;
    30         }
    31         printf("%d\n",maxsize);
    32     }
    33     return 0;
    34 }

    (1)设置一个堆栈用来矩形.遇到比上一个矩形高度高的新矩形就入栈.
    (2)如果遇到比上一个矩形高度低的矩形就要进行出栈合并以及最大矩形面积计算的处理.假设当前新矩形的高和宽分别为curh, curw, 利用totalw统计出栈的矩形的宽度和,然后一直进行出栈操作,每出栈一个矩形就将其宽度加到totalw上,统计将其高度乘以totalw与maxsize比较进行更新.出栈矩形的高度乘以totalw表示的是以这个矩形的高为大矩形的高可以得到的最大矩形面积.出栈操作一直进行到栈顶矩形的高度小于等于新矩形的高度.最后将新矩形的高度以及totalw + curw作为一个新的元素压入栈中.这样就完成了这种情况下对新矩形的操作.
    (3)最后栈中还有一些列的矩形,这些矩形构成了一个高度非降序的矩形序列.然后再进行一边出栈处理就可以了.

  • 相关阅读:
    分布式锁
    zookeeper
    工作流笔记第四天_流程变量
    工作流笔记第三天_流程实例
    工作流笔记第二天_流程定义的CRUD
    工作流笔记第一天_简单介绍activiti
    groovy修改代码不用重启通过监听记录改变时间重新加载
    遇到的前端问题
    常用正则表达式大全
    Hibernate中Session.get()方法和load()方法的详细比较
  • 原文地址:https://www.cnblogs.com/shihuajie/p/2626212.html
Copyright © 2011-2022 走看看