测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A37453. 最大的矩形纸片

填空题 困难

题目描述

最大的矩形纸片

题目描述

编程实现:最大的矩形纸片

一张半边参差不齐的网格纸 (网格边长均为1),有一边是完整没有破损的。现要从中剪出一片面积最大的矩形纸片。

给定网格纸中完整边的长度N (1<=N<=1000000) ,以及网格中每一列残存部分的高度(1<=高度<=10000),输出能够剪出的最大矩形纸片面积。

例如: N=6,每一列残存部分的高度依次为3、2、1、4、5、2,如下图所示:

可以发现,沿着红色框可以剪出的矩形纸片面积最大,为8,所以输出8。

输入描述

第一行输入一个正整数N(1≤N≤1000000),表示纸片完整边的长度

第二行输入N个正整数(1≤正整数≤10000),表示每列格子残存部分的高度,两个正整数之间用一个空格隔开

输出描述

输出一个正整数,表示能够剪出的最大矩形纸片面积

样例输入

6

3 2 1 4 5 2

样例输出

8

参考答案

#include <bits/stdc++.h> using namespace std; const int N = 1000010; int h[N], z[N], y[N], n, maxn = 0, s; int main() { cin >> n; for (int i = 1; i <= n; i++) { cin >> h[i]; z[i] = i; //左边界 y[i] = i; //右边界 }//初始化左右边界 //求所有悬线的左边界 for (int i = 1; i <= n; i++) { while (z[i] > i && h[i] <= h[z[i] - 1]) { //z[i]-1为左边界前一项 z[i] = z[z[i] - 1]; //继承前一项的左边 } } //求所有悬线的右边界 for (int i = 1; i <= n; i++) { while (y[i] < n && h[i] <= h[y[i] + 1]) { //y[i]+1为右边界后一项 y[i] = y[y[i] + 1]; //继承后一项的右边 } } //打擂台 for (int i = 1; i <= n; i++) { s = h[i] * (y[i] - z[i] + 1); maxn = max(s, maxn); } cout << maxn; return 0; }
上一题 下一题