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
  • 相关阅读:
    Pandas 合并,连接,连接和比较
    根据条件在Pandas DataFrame中选择行
    pandas DataFrame.where() 检查一个或多个条件的数据帧,并相应地返回结果
    获取包含给定子字符串的Pandas DataFrame中的所有行
    Pandas Series.str.contains
    Python | 查找给定字符串中字符的位置
    Python中的Enumerate()
    Python –遍历NumPy中的列
    Boost 编译
    opencv 提取RGB并用cocos2d-x 纹理方式显示
  • 原文地址:https://www.cnblogs.com/oyking/p/3296118.html
Copyright © 2011-2022 走看看