【数据结构 | C语言】happiness

一排礼物编号为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)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋说

感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值