1 条题解
-
0
C++ :
#include<iostream> #include<cstdio> using namespace std; #define MAXN 400000 #define LL long long int h[400010]; int n; int Queue[400010]; int L[400010],R[400010]; int main() { cin>>n; int i; for (i=1;i<=n;i++) cin>>h[i]; h[0]=h[n+1]=-1; Queue[0]=0; int Head=0,Tail=1; for (i=1;i<=n;i++) { while (Head<Tail && h[i]<=h[Queue[Tail-1]]) Tail--; L[i]=i-Queue[Tail-1]-1; Queue[Tail++]=i; } Queue[0]=n+1; Head=0,Tail=1; for (i=n;i>=1;i--) { while (Head<Tail && h[i]<=h[Queue[Tail-1]]) Tail--; R[i]=Queue[Tail-1]-i-1; Queue[Tail++]=i; } long long MaxArea=0; for (i=1;i<=n;i++) { long long Area=(L[i]+R[i]+1)*h[i]; if (Area>MaxArea) MaxArea=Area; } cout<<MaxArea<<endl; return 0; }Java :
import java.util.Scanner; public class Main { public static void main(String[] args) { Main test = new Main(); Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[] arr = new int[n]; for (int i = 0; i < n; i++) arr[i] = sc.nextInt(); System.out.println(test.largestArea(arr)); } public int largestArea(int[] height){ if(height == null || height.length == 0) return 0; return largestArea(height, height.length); } private int largestArea(int[] height, int n) { int[]left = new int[n]; int[]right = new int[n]; left[0] = 0; right[n-1] = n-1; for (int i = 1; i < n; i++) { // 找到最左边的比它大的元素 int last = i; while (last >= 1 && height[i] <= height[last-1]) last = left[last-1]; left[i] = last; } for (int i = n-2; i >= 0; i--) { // 找到最右边的比它大的元素 int last = i; while (last < n - 1 && height[i] <= height[last+1]) last = right[last+1]; right[i] = last; } int ans = 0; for (int i = 0; i < n; i++) ans = Math.max(ans,(right[i]-left[i]+1)*height[i]); return ans; } }
- 1
信息
- ID
- 1413
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者