CCF 201312-3 最大的矩形 (暴力,离散化)

问题描述

  在横轴上放了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

析:我们可以对它进行离散化,把每个小区间的小矩形都算一下,再更新最大值,O(n^2),复杂度。

代码如下:

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <cstring>
#include <set>
#include <queue>
#include <algorithm>
#include <vector>
#include <map>
#include <cctype>
#include <cmath>
#include <stack>
#define frer freopen("in.txt", "r", stdin)
#define frew freopen("out.txt", "w", stdout)
using namespace std;

typedef long long LL;
typedef pair<int, int> P;
const int INF = 0x3f3f3f3f;
const double inf = 0x3f3f3f3f3f3f;
const double PI = acos(-1.0);
const double eps = 1e-8;
const int maxn = 1e3 + 5;
const int mod = 1e9 + 7;
const int dr[] = {-1, 1, 0, 0};
const int dc[] = {0, 0, 1, -1};
const char *de[] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
int n, m;
const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
inline int Min(int a, int b){ return a < b ? a : b; }
inline int Max(int a, int b){ return a > b ? a : b; }
inline LL Min(LL a, LL b){ return a < b ? a : b; }
inline LL Max(LL a, LL b){ return a > b ? a : b; }
inline bool is_in(int r, int c){
    return r >= 0 && r < n && c >= 0 && c < m;
}
int h[maxn];

int solve(int s, int t){
    int ans = INF;
    for(int i = s; i < t; ++i)  ans = Min(ans, h[i]);
    return ans;
}

int main(){
    cin >> n;
    for(int i = 0; i < n; ++i)  scanf("%d", &h[i]);
    int ans = 0;
    for(int i = 0; i < n; ++i)
        for(int j = i; j < n; ++j)
            ans = Max(ans, solve(i, j+1) * (j-i+1));
    printf("%d\n", ans);
    return 0;
}
时间: 2024-10-14 04:27:48

CCF 201312-3 最大的矩形 (暴力,离散化)的相关文章

CCF系列之最大的矩形(201312-3)

试题名称: 最大的矩形 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ i ≤ n)个矩形的高度是hi.这n个矩形构成了一个直方图.例如,下图中六个矩形的高度就分别是3, 1, 6, 5, 2, 3. 请找出能放在给定直方图里面积最大的矩形,它的边要与坐标轴平行.对于上面给出的例子,最大矩形如下图所示的阴影部分,面积是10. 输入格式 第一行包含一个整数n,即矩形的数量(1 ≤ n ≤ 1000). 第二行包

CCF真题之最大矩形

201312-3 问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ i ≤ n)个矩形的高度是hi.这n个矩形构成了一个直方图.例如,下图中六个矩形的高度就分别是3, 1, 6, 5, 2, 3. 请找出能放在给定直方图里面积最大的矩形,它的边要与坐标轴平行.对于上面给出的例子,最大矩形如下图所示的阴影部分,面积是10. 输入格式 第一行包含一个整数n,即矩形的数量(1 ≤ n ≤ 1000). 第二行包含n 个整数h1, h2, … , hn,相邻的数之间由空格分隔.(

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

CCF201312-3最大矩形(暴力)

    1 #include<iostream> 2 using namespace std; 3 //暴力计算 4 int a[1001];//原数组 5 int main(){ 6 int i,j,k,n,max,len,temp; 7 cin>>n; 8 for(i=0;i<n;i++){ 9 cin>>a[i]; 10 } 11 max=a[0]; 12 for(i=0;i<n;i++){ 13 len=1; 14 for(j=i-1;j>=0

CCF模拟试题——最大的矩形 Java

我们先看一下题目: 问题描述 试题编号:         201312-3 试题名称: 最大的矩形 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ i ≤ n)个矩形的高度是hi.这n个矩形构成了一个直方图.例如,下图中六个矩形的高度就分别是3, 1, 6, 5, 2, 3. 请找出能放在给定直方图里面积最大的矩形,它的边要与坐标轴平行.对于上面给出的例子,最大矩形如下图所示的阴影部分,面积是10. 输入格式

CCF认证真题-(201409-2)-画图(暴力)

1 #include <iostream> 2 #include <algorithm> 3 #include <set> 4 using namespace std; 5 6 bool vis[105][105]{false}; 7 int main() 8 { 9 ios::sync_with_stdio(false); 10 cin.tie(0); 11 int n; 12 cin >> n; 13 int x1, y1, x2, y2, s = 0;

POJ 1389 Area of Simple Polygons(面积合并,线段树+离散化)

Area of Simple Polygons Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3257   Accepted: 1678 Description There are N, 1 <= N <= 1,000 rectangles in the 2-D xy-plane. The four sides of a rectangle are horizontal or vertical line segment

NOI模拟(3.3)螺旋序列

Description S也想寻求真正的智慧,然而由于“抑制力”的存在,她必须先解决一系列询问.有一个长度为n的序列a,一个长度为m序列b被称为螺旋序列当且仅当b1=bm且对于1<=i<=m有bi<=b1.S需要回答q个询问,每个询问用l,r两个参数描述,表示询问区间[l,r]的最长连续子螺旋序列的长度. Input 第一行两个整数n,q,表示序列长度和询问数.第二行n个整数ai表示序列a.以下q行,每行两个整数l,r表示一次询问. Output 对每次询问输出一行一个整数表示最大连续螺

jzoj1495 宝石 解题报告[扫描线]

Description 见上帝动了恻隐之心,天后也想显示一下慈悲之怀,随即从口袋中取出一块魔术方巾,让身边的美神维纳斯拿到后堂的屏风上去试试,屏风是正方形的,高和宽方向上各划有m条鱼屏风的边平行的直线,平行直线间的距离为1厘米.这2m条直线共有m*m个交点,在某些交点上镶嵌着宝石.如果魔术方巾的边与屏风的边平行且魔术方巾触碰到屏风上镶嵌着的宝石,就将与这些宝石等值的金银送给人们.维纳斯想让魔术方巾触碰到的宝石的价值最多,可要在短短的1秒钟之内解决问题,也感到力不从心,你能帮帮她吗? Input