每日一题7.29
记录详情 - 洛谷 | 计算机科学教育新生态
题目描述
一张半边参差不齐的网格纸(网格边长均为 1),有一边是完整没有破损的。现要从中剪出一片面积最大的矩形纸片。
给定网格纸中完整边的长度 N(1≤N≤1000000),以及网格中每一列残存部分的高度(1≤ 高度 ≤10000),输出能够剪出的最大矩形纸片面积。
输入格式
第一行输入一个正整数 N(1≤N≤1000000),表示纸片完整边的长度。
第二行输入 N 个正整数(1≤ 正整数 ≤10000),表示每列格子残存部分的高度,两个正整数之间用一个空格隔开。
输出格式
输出一个正整数,表示能够剪出的最大矩形纸片面积。
输入输出样例
输入 #1复制
6 3 2 1 4 5 2
输出 #1复制
8
单调栈板子题,卡我好长时间。
#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{int n,mx=0; cin >> n;vector<int> h(n+2),a;h[0]=h[n+1]=0;for (int i = 1; i <= n; i++)cin >> h[i];for (int i = 1; i <= n+1; i++){while (!a.empty() && h[a.back()] >= h[i]){int high=h[a.back()]; a.pop_back();int width=a.empty()?i-1:i-a.back()-1;mx=max(mx,high*width);}a.push_back(i);}cout << mx << endl;return 0;
}
最后找半天bug才知道我width判定错误了。我原本写的是这样子的
int high=h[a.back()];
int width=i-a.back();
mx=max(mx,high*width);
a.pop_back();
但是比如1,7,2,4,3;
出栈了之后的栈顶的右边才算这个大矩形的左边界,而不是小矩形的左边界