• CCF模拟题 最大的矩形


    最大的矩形

    时间限制: 1.0s
    内存限制: 256.0MB
     
     
    问题描述

    在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ i ≤ n)个矩形的高度是hi。这n个矩形构成了一个直方图。例如,下图中六个矩形的高度就分别是3, 1, 6, 5, 2, 3。

    请找出能放在给定直方图里面积最大的矩形,它的边要与坐标轴平行。对于上面给出的例子,最大矩形如下图所示的阴影部分,面积是10。

    输入格式

    第一行包含一个整数n,即矩形的数量(1 ≤ n ≤ 1000)。

    第二行包含n 个整数h1, h2, … , hn,相邻的数之间由空格分隔。(1 ≤ hi ≤ 10000)。hi是第i个矩形的高度。

    输出格式
    输出一行,包含一个整数,即给定直方图内的最大矩形的面积。
     
    样例输入

    6

    3 1 6 5 2 3

    样例输出
    10
     
    解题:哼哼哈哈 快使用单调栈
     
     1 #include <bits/stdc++.h>
     2 #define LL long long
     3 using namespace std;
     4 
     5 struct Node {
     6     LL height,pos;
     7     Node(LL x = 0,LL y = 0){
     8         height = x;
     9         pos = y;
    10     }
    11 } Nodee;
    12 
    13 stack<Node> stk;
    14 int main() {
    15     LL n,a,ans,idx;
    16     while(~scanf("%I64d",&n)) {
    17         while(!stk.empty())  stk.pop();
    18         stk.push(Node(0,0));
    19         for(LL i = ans = 0; i < n; i++) {
    20             scanf("%I64d",&a);
    21             idx = i;
    22             while(a < stk.top().height) {
    23                 ans = max(ans,stk.top().height * (i - stk.top().pos));
    24                 idx = stk.top().pos;
    25                 stk.pop();
    26             }
    27             stk.push(Node(a,idx));
    28         }
    29         while(!stk.empty()) {
    30             ans = max(ans,stk.top().height * (n - stk.top().pos));
    31             stk.pop();
    32         }
    33         printf("%I64d
    ",ans);
    34     }
    35     return 0;
    36 }
    View Code
  • 相关阅读:
    Java实现文件下载Zip压缩
    @FeignClient注解
    java实现发送邮件功能
    服务熔断Hystrix高级
    java复制文件的4种方式及拷贝文件到另一个目录下的实例代码
    java下载zip文件
    Spring Boot 全局异常处理@ControllerAdvice
    vue入门实践
    读书札记:影响日元的因素
    情感日记:蒙太奇的破碎
  • 原文地址:https://www.cnblogs.com/crackpotisback/p/4355720.html
Copyright © 2020-2023  润新知