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
  • 相关阅读:
    docker设置国内镜像
    asp.net core 构建docker镜像
    asp.net POST 数据
    asp.net core 增加浏览器缓存设置
    .net fx源码
    新项目升级到JFinal3.5之后的改变-着重体验自动依赖注入
    微信小程序教程汇总
    如何注册微信小程序
    JFinal-美女图爬虫-一个不正经的爬虫代码
    投资20万研发的JFinal项目《旅游线路营销管理系统》准备公开课中
  • 原文地址:https://www.cnblogs.com/oyking/p/3296118.html
Copyright © 2011-2022 走看看