ccf认证模拟题之三---最大的矩形

系统 1537 0
问题描述

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

 

 

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

 

 

输入格式

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

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

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

6

3 1 6 5 2 3

样例输出
10
 
 
 
代码:
          
             1
          
           #include <fstream>


          
             2
          
           #include <iostream>


          
             3
          
           #include <algorithm>


          
             4
          
           #include <cstdio>


          
             5
          
           #include <cstring>


          
             6
          
           #include <cmath>


          
             7
          
           #include <cstdlib>


          
             8
          
          
             9
          
          
            using
          
          
            namespace
          
          
             std;


          
          
            10
          
          
            11
          
          
            #define
          
           PI acos(-1.0)


          
            12
          
          
            #define
          
           EPS 1e-10


          
            13
          
          
            #define
          
           lll __int64


          
            14
          
          
            #define
          
           ll long long


          
            15
          
          
            #define
          
           INF 0x7fffffff


          
            16
          
          
            17
          
          
            int
          
           n,ic[
          
            10005
          
          
            ];


          
          
            18
          
          
            19
          
          
            int
          
          
             main()


          
          
            20
          
          
            {


          
          
            21
          
          
            //
          
          
            freopen("D:\\input.in","r",stdin);


          
          
            22
          
          
            //
          
          
            freopen("D:\\output.out","w",stdout);
          
          
            23
          
          
            int
          
           ans=-
          
            1
          
          ,t=-
          
            1
          
          
            ,h;


          
          
            24
          
               scanf(
          
            "
          
          
            %d
          
          
            "
          
          ,&
          
            n);


          
          
            25
          
          
            for
          
          (
          
            int
          
           i=
          
            0
          
          ;i<n;i++)    scanf(
          
            "
          
          
            %d
          
          
            "
          
          ,&
          
            ic[i]);


          
          
            26
          
          
            for
          
          (
          
            int
          
           i=
          
            0
          
          ;i<n;i++
          
            ){


          
          
            27
          
          
            if
          
          (ic[i]<=
          
            t){


          
          
            28
          
                       t=ic[i];
          
            //
          
          
            这里要注意更新t
          
          
            29
          
          
            continue
          
          
            ;


          
          
            30
          
          
                    }


          
          
            31
          
                   h=t=
          
            ic[i];


          
          
            32
          
          
            for
          
          (
          
            int
          
           j=i+
          
            1
          
          ;j<n;j++
          
            ){


          
          
            33
          
          
            if
          
          (ic[j]<
          
            h){


          
          
            34
          
                           ans=max(ans,h*(j-
          
            i));


          
          
            35
          
                           h=
          
            ic[j];


          
          
            36
          
          
                        }


          
          
            37
          
          
                    }


          
          
            38
          
                   ans=max(ans,h*(n-
          
            i));


          
          
            39
          
          
                }


          
          
            40
          
               printf(
          
            "
          
          
            %d\n
          
          
            "
          
          
            ,ans);


          
          
            41
          
          
            return
          
          
            0
          
          
            ;


          
          
            42
          
           }
        
View Code

 

ccf认证模拟题之三---最大的矩形


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论