一排礼物编号为1到n,每件礼物都有一个满意值w[i]。现在小V要从中选取连续编号的礼物(即选取[l,r]内的礼物),使得获得的 happiness 最大,请你帮他。[l,r]内的 happiness 定义为:([l,r]内所有礼物满意值的最小值)*([l,r]内所有礼物满意值的和)
输入格式:第一行为一个正整数n,第二行为n个整数w[1],w[2], …,w[n]
输出格式:小V能获得的最大happiness值。
#include <bits/stdc++.h>
using namespace std;
long long satisfy[100005],qzh[100005];
int main(){
ios::sync_with_stdio(false);cin.tie(0);
int n;cin>>n;
for(int i=0;i<n;i++){
cin>>satisfy[i];
if(i==0)qzh[i]=satisfy[i];
else qzh[i]=qzh[i-1]+satisfy[i];
}
stack<long long> s;long long result=0,result1;
int i=0;while(i<=n){
if(s.empty()||satisfy[i]>=satisfy[s.top()]){
s.push(i);i++;//若栈空或大于等于栈顶,入栈
}else{
long long t=s.top();s.pop();
if(s.empty()) result1=qzh[i-1]*satisfy[t];
else result1=(qzh[i-1]-qzh[s.top()])*satisfy[t];
}
if(result1>result)result=result1;
}cout<<result;return 0;
}
输入示例:3 \n 1 2 3 输出示例:10,即2*(2+3)
5万+

被折叠的 条评论
为什么被折叠?



