时间限制:3秒 空间限制:131072K
間隔は、すべての最大値として算出した後に間隔があるように要求間隔を、選択、アレイ配列を与え:
インターバル最小数は*すべてのセクションの数と最後のプログラムが計算に最大値を出力し、出力は、特定の間隔を必要としません。所定のシーケンスは[621]は、上記式によれば、すべての計算された値を選択することができ、セクションごとに得られます。
[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の最初の行、第2列の入力アレイ配列。
データの50%、1 <= N <= 10000 ;
データの100%に、1 <= N <= 500000 。
出力説明:
出力アレイの算出後の最大値。
実施例1つの入力:
3
6 1 2。
出力例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;
}