들쭉날쭉한 절반 면(각 격자 면의 길이는 1)이 있고 한 면은 온전하고 손상되지 않은 모눈 종이 조각입니다. 이제 가장 큰 면적의 직사각형 종이를 잘라야 합니다.
모눈 종이의 전체 변의 길이 N과 모눈의 각 열의 나머지 부분의 높이가 주어지면 잘라낼 수 있는 가장 큰 직사각형 종이 영역을 출력하십시오.
첫 번째 줄에는 용지의 전체 면 길이를 나타내는 양의 정수 N이 입력됩니다.
두 번째 줄에는 그리드의 각 열의 나머지 부분의 높이를 나타내는 N 양의 정수를 입력하고 두 양의 정수를 구분하기 위해 공백을 사용합니다.
잘라낼 수 있는 가장 큰 직사각형 종이의 면적을 나타내는 양의 정수를 출력합니다.
샘플 입력
6
3 2 1 4 5 2
샘플 출력
8
무차별 대입 가능:
차례로 순회하면서 각 idx는 높이가 >= 해당 위치의 높이인 인접한 연속 idx의 수를 검색하고, 경기장 mx = max(mx, 연속 숫자의 수 * idx의 높이.
전설:
mx = 3;
mx = 4;
mx = 6;
참고: 보라색 5는 6이어야 합니다.
mx = 8;
mx = 8;
mx = 8;
출력 8.
그것을 찾는 방법?
왼쪽과 오른쪽을 확인하고 한 줄이 더 있으면 연속적일 수 있고 그렇지 않으면 잘려서 끊어집니다.
폭력적인 코드:
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, mx;
int a[1000009];
int b[1000009];
signed main () {
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 1; i <= n; i++) {
b[i] = a[i];
for (int j = i - 1; j >= 1; j--) {
if (a[j] >= a[i]) b[i] += a[i];
else break;
}
for (int j = i + 1; j <= n; j++) {
if (a[j] >= a[i]) b[i] += a[i];
else break;
}
mx = max (mx, b[i]);
}
cout << mx;
return 0;
}