時間限制:3秒 空間限制:131072K
給定一個數組序列, 需要求選出一個區間, 使得該區間是所有區間中經過如下計算的值最大的一個:
區間中的最小數 * 區間所有數的和最后程序輸出經過計算后的最大值即可,不需要輸出具體的區間。如給定序列 [6 2 1]則根據上述公式, 可得到所有可以選定各個區間的計算值:
[6] = 6 * 6 = 36;
[2] = 2 * 2 = 4;
[1] = 1 * 1 = 1;
[6,2] = 2 * 8 = 16;
[2,1] = 1 * 3 = 3;
[6, 2, 1] = 1 * 9 = 9;
從上述計算可見選定區間 [6] ,計算值為 36, 則程序輸出為 36。
區間內的所有數字都在[0, 100]的范圍內;
輸入描述:
第一行輸入數組序列長度n,第二行輸入數組序列。
對於 50%的數據, 1 <= n <= 10000;
對於 100%的數據, 1 <= n <= 500000;
輸出描述:
輸出數組經過計算后的最大值。
輸入例子1:
3
6 2 1
輸出例子1:
36
思路:
每個元素都可能是某個或多個區間的最小值,所以當最小值確定的時候,區間越大越好,可以固定每個最小值,然后找區間左邊界和右邊界,
#include<iostream>
#include<vector>
#include<limits.h>
#include<algorithm>
using namespace std;
int main(){
int n;
cin>>n;
vector<int> nums(n);
for(int i=0; i<n; i++) cin>>nums[i];
// 每次假設當前為最小
int cur_max = -1;
for(int i=0; i<n; i++){
// 假設nums[i]是某個區間的最小值,那么這個區間應該越大越好,所以可以來找區間的左邊界和右邊界
int l=i;
while(l>=0 && nums[l]>=nums[i]) l--;
int r = i;
while(r<n && nums[r]>=nums[i]) r++;
int sum = accumulate(nums.begin()+l+1, nums.begin()+r, 0);
cur_max = max(cur_max, sum*nums[i]);
}
cout<<cur_max<<endl;
return 0;
}