zoukankan      html  css  js  c++  java
  • POJ 2082 Terrible Sets(栈)

    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.

    题目大意:有n个并列的长方形,找出一个长方形,使其落下这n个长方形上,并且面积最大。

    思路:不会讲……给个tips,有一些答案不可能成为最大矩形就不用算了。

    代码(94MS):

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 #include <algorithm>
     5 #include <stack>
     6 using namespace std;
     7 
     8 const int MAXN = 50010;
     9 
    10 struct Rectangle {
    11     int w, h;
    12     void read() {
    13         scanf("%d%d", &w, &h);
    14     }
    15 };
    16 
    17 Rectangle a[MAXN], t;
    18 int ans, n;
    19 
    20 void solve() {
    21     ans = 0;
    22     int last = 0;
    23     stack<Rectangle> stk;
    24     for(int i = 0; i < n; ++i) {
    25         t.read();
    26         if(last < t.h) stk.push(t);
    27         else {
    28             int total = 0;
    29             while(!stk.empty() && stk.top().h > t.h) {
    30                 total += stk.top().w;
    31                 ans = max(ans, stk.top().h * total);
    32                 stk.pop();
    33             }
    34             t.w += total;
    35             stk.push(t);
    36         }
    37         last = t.h;
    38     }
    39     int total = 0;
    40     while(!stk.empty()) {
    41         total += stk.top().w;
    42         ans = max(ans, stk.top().h * total);
    43         stk.pop();
    44     }
    45 }
    46 
    47 int main() {
    48     while(scanf("%d", &n) != EOF) {
    49         if(n == -1) break;
    50         solve();
    51         printf("%d
    ", ans);
    52     }
    53 }
    View Code
  • 相关阅读:
    基本排序算法
    Ubuntu下fcitx安装。(ibus不会用)
    sublime搭建Java编译平台及编码问题
    Centos6.5(final)安装gcc和g++,python以及导致问题的解决方法
    如何查询centos查看系统内核版本,系统版本,32位还是64位
    vim插件之SnipMate
    Linux rename命令
    Hadoop安装(Ubuntu Kylin 14.04)
    vim 文字插入
    Checkbox indeterminate属性
  • 原文地址:https://www.cnblogs.com/oyking/p/3296118.html
Copyright © 2011-2022 走看看