POJ 2082(最大连续矩形面积)

Terrible Sets

Time Limit: 1000MS   Memory Limit: 30000K
Total Submissions: 2428   Accepted: 1215

Description

Let N be the set of all natural numbers {0 , 1 , 2 , . . . }, and R be the set of all real numbers. wi, hi for i = 1 . . . n are some elements in N, and w0 = 0.
Define set B = {< x, y > | x, y ∈ R and there exists an index i > 0 such that 0 <= y <= hi ,∑0<=j<=i-1wj <= x <= ∑0<=j<=iwj}
Again, define set S = {A| A = WH for some W , H ∈ R+ and there exists x0, y0 in N such that the set T = { < x , y > | x, y ∈ R and x0 <= x <= x0 +W and y0 <= y <= y0 + H} is contained in set B}.
Your mission now. What is Max(S)?
Wow, it looks like a terrible problem. Problems that appear to be terrible are sometimes actually easy.
But for this one, believe me, it's difficult.

Input

The input consists of several test cases. For each case, n is given in a single line, and then followed by n lines, each containing wi and hi separated by a single space. The last line of the input is an single integer -1, indicating the end of input. You may assume that 1 <= n <= 50000 and w1h1+w2h2+...+wnhn < 109.

Output

Simply output Max(S) in a single line for each case.

Sample Input

3
1 2
3 4
1 2
3
3 4
1 2
3 4
-1

Sample Output

12
14测试用例的情况

解题分析:

//想骂人,简单的题意说的那么高深,特别是最后一句,估计管理员要阴笑啦
//大致题意:给定连续的矩形的宽和长,求出最大的连续矩形的面积
/*
维护一个栈中元素高度单调递增的栈,初始化栈中第一个元素高度宽度均为0,
然后每次读入一个矩形,若它比栈顶元素还高就直接进栈,
否则不断将栈中元素弹栈,直到当前栈顶元素能够与读入的矩形满足高度递增。
弹栈过程中累加弹出的元素的宽度,然后每弹出一个就判断当前弹出元素的高度×
累加的宽度能否更新最大面积ans。然后以新的矩形作高,
已经弹出栈的元素总宽度加上新矩形宽度作宽,把这个矩形插入到栈里。
最终栈肯定是一个单调的,只需要再把栈一个个弹空,弹栈过程中仍像上面那样计算即可。
*/
#include <iostream>
#include <cstring>
#include <stack>
using namespace std;
typedef struct Node
{
    int w,h;
}Node;
int main()
{
    int i,j,k,T;
    stack <Node > s;
    while(cin>>T,~T)
    {
        int max_area = 0;
        int total_w,cur_area;
        Node *rect = new Node[T+2];
        for(i=0;i<T;i++)
        {
            cin>>rect[i].w>>rect[i].h;
            if(s.empty())
                s.push(rect[i]);
            else
            {
                total_w=cur_area=0;
                if(rect[i].h>=s.top().h)//此处是大于等于
                    s.push(rect[i]);
                else
                {
                    while(!s.empty())
                    {
                        if(rect[i].h<s.top().h)//此处只是小于
                        {
                            total_w += s.top().w;
                            if((cur_area=total_w*s.top().h)>max_area)
                                max_area = cur_area;
                            s.pop();
                        }
                        else
                            break;//跳出和继续下一次是不一样的
                    }
                    total_w += rect[i].w;
                    rect[i].w = total_w;
                    s.push(rect[i]);
                }
            }
        }
        total_w = cur_area = 0;
        while(!s.empty())
        {
            total_w += s.top().w;
            if((cur_area=total_w*s.top().h)>max_area)
                max_area = cur_area;
            s.pop();
        }
        cout<<max_area<<endl;
        delete []rect;//加不加均AC
    }
    //system("pause");  s.clear();//没加也AC
    return 0;
}

 

 

 

				
时间: 2024-09-27 02:45:15

POJ 2082(最大连续矩形面积)的相关文章

直方图中最大矩形面积

Largest Rectangle in Histogram 直方图中最大矩形面积 一个直方图是由许多矩形组成,在给定的直方图中找出最大的矩形面积.为了简化问题,假定所有矩形宽度都为1个单位. 例如,下面的直方图中有7个矩形,高度分别是(6,2,5,4,5,2,6).最大的矩形面积是12(如下图所示,最大矩形面积用红色方框标出) 下面给出的解决方法时间复杂度为O(n).矩形面积的计算公式为底*高.对于直方图中的每个矩形'x'(例如图中高度为6,2或5的矩形)以该矩形的高度为高(因为在直方图中最大

面向对象编程方式实现四则运算和计算矩形面积

用Javascript实现类似两个选项卡切换的效果,用面向对象编程的方式,实现四则运算和计算矩形面积: CatView.php: <html> <head> <meta http-equiv="content-type" content="text/html;charset=GBK" /> <script language="javascript"> <!-- function selType

Raptor实践参考:求矩形面积

返回->课程主页 1-2 求矩形面积 输入矩形的长和宽,计算并输出矩形的面积 [参考解答]

Raptor实践参考:求矩形面积的过程

返回->课程主页 1-3 求矩形面积的过程 输入矩形的长和宽,计算并输出矩形的面积.要求将求面积的功能定义为一个过程. [参考解答]

poj 2479 最大连续子段和 dp算法

一.文章来由 晚上一水~~poj2479,一道简单的dp问题,回顾一下动态规划 二.求最大子段和 这道题是求一个序列中的两个子段的最大和,是求纯的最大和的一个变体,例如题目中给出的例子 1 -1 2 2 3 -3 4 -4 5 -5 In the sample, we choose {2,2,3,-3,4} and {5}, then we can get the answer. 答案是 13 如何求一个序列的子段和: int MaxSub (int a[],int N)//此为只需要求最大的和

庞果网之寻找直方图中面积最大的矩形

题目详情 给定直方图,每一小块的height由N个非负整数所确定,每一小块的width都为1,请找出直方图中面积最大的矩形.    如下图所示,直方图中每一块的宽度都是1,每一块给定的高度分别是[2,1,5,6,2,3]:    那么上述直方图中,面积最大的矩形便是下图所示的阴影部分的面积,面积= 10单位.    请完成函数largestRectangleArea,实现寻找直方图中面积最大的矩形的功能,如当给定直方图各小块的高度= [2,1,5,6,2,3] ,返回10. [解析] 使用一个栈

c++-[C++]问:在下面矩形的抽象数据类型基础上设计矩形的周长和面积的操作

问题描述 [C++]问:在下面矩形的抽象数据类型基础上设计矩形的周长和面积的操作 #include<iostream> using namespace std; struct Rect{ double length; double width; };//声明矩形(矩形的类型定义) void InitRect(Rect &R, double l, double w);//构造矩形 //求矩形周长 //求矩形面积 int main() { Rect my_rect;//定义矩形变量my_r

POJ题目分类

初期: 一.基本算法:      (1)枚举. (poj1753,poj2965)      (2)贪心(poj1328,poj2109,poj2586)      (3)递归和分治法.      (4)递推.      (5)构造法.(poj3295)      (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996) 二.图算法:      (1)图的深度优先遍历和广度优先遍历.      (2)最短路径算法(dijkstra,bellman-ford

poj分类

初期: 一.基本算法:      (1)枚举. (poj1753,poj2965)      (2)贪心(poj1328,poj2109,poj2586)      (3)递归和分治法.      (4)递推.      (5)构造法.(poj3295)      (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996) 二.图算法:      (1)图的深度优先遍历和广度优先遍历.      (2)最短路径算法(dijkstra,bellman-ford