小C的数学问题 【Set应用】

本文介绍了一道关于寻找最大区间价值的问题,并提供了一个高效的解决方案。通过使用set维护左右边界,避免了暴力求解的超时风险。

题目传送门

问题 J: 小C的数学问题

时间限制: 1 Sec  内存限制: 128 MB
提交: 398  解决: 84
[提交] [状态] [命题人:外部导入]

题目描述

小C是个云南中医学院的大一新生,在某个星期二,他的高数老师扔给了他一个问题。

让他在1天的时间内给出答案。

但是小C不会这问题,现在他来请教你。

请你帮他解决这个问题。

有n个数,每个数有权值。

数学老师定义了区间价值为区间和乘上区间内的最小值。

现在要你找出有最大区间价值的区间是什么,并输出区间价值。

 

输入

每个输入文件只包含单组数据。
第一行一个整数n。(1 <= n <= 100000)
第二行n个整数a_1,a_2,...,a_n。(0 <= a_i <= 1000000)

 

输出

第一行输出一个整数,表示最大的区间价值。
第二行输出两个整数,表示区间的起点和终点。
保证答案唯一。

 

样例输入

复制样例数据

6
10 1 9 4 5 9

样例输出

108
3 6

解题思路:将arr[i]作为最小值,分别寻找左边比arr[i]小的那个位置的后一个位置和右边比arr[i]小的那个位置的前一个位置,但是直接暴力会超时,可以优化查找左边比arr[i]小的位置和右边比arr[i]小的位置,用set维护

AC代码:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
using namespace std;
#define io ios::sync_with_stdio(0),cin.tie(0)
#define ms(arr) memset(arr,0,sizeof(arr))
#define mc(a,b) memcpy(a,b,sizeof(b))
#define inf 0x3f3f3f
#define fin freopen("in.txt", "r", stdin)
#define fout freopen("out.txt", "w", stdout)
typedef long long ll;
typedef unsigned long long ULL;
const int mod=1e9+7;
const int N=1e5+7;
struct node
{
    int x;
    int id;
}arr[N];
int n;
ll sum[N];
set <ll> s1,s2;
bool cmp(node a,node b)
{
    return a.x<b.x;
}
int main()
{
    cin>>n;
    sum[0]=0;
    for(int i=1;i<=n;i++){
        cin>>arr[i].x;
        arr[i].id=i;
        sum[i]=sum[i-1]+arr[i].x;
    }
    sort(arr+1,arr+n+1,cmp);
    set<ll>::iterator it;
    s1.clear();
    s2.clear();
    s1.insert(n+1);
    s2.insert(n+1);
    int i=1;
    int l,r,t1,t2;
    ll ma=-1;
    int L,R;
    while(i<n+1)
    {
        l=r=i;
        while(arr[l].x==arr[r+1].x&&r<=n) r++;
        for(int j=l;j<=r;j++)
        {
            it=s1.lower_bound(n+1-arr[j].id);
            t1=n+1-*it;
            it=s2.lower_bound(arr[j].id);
            t2=*it;
            ll ans=(sum[t2-1]-sum[t1])*arr[i].x;
            if(ans>ma)
            {
                ma=ans;
                L=t1+1;
                R=t2-1;
            }
        }
        for(int j=l;j<=r;j++)
        {
            s1.insert(n+1-arr[j].id);
            s2.insert(arr[j].id);
        }
        i=r+1;
    }
    cout<<ma<<endl;
    cout<<L<<" "<<R<<endl;
    return 0;
}

 

基于径向基函数神经网络RBFNN的自适应滑模控制学习(Matlab代码实现)内容概要:本文介绍了基于径向基函数神经网络(RBFNN)的自适应滑模控制方法,并提供了相应的Matlab代码实现。该方法结合了RBF神经网络的非线性逼近能力和滑模控制的强鲁棒性,用于解决复杂系统的控制问题,尤其适用于存在不确定性和外部干扰的动态系统。文中详细阐述了控制算法的设计思路、RBFNN的结构与权重更新机制、滑模面的构建以及自适应律的推导过程,并通过Matlab仿真验证了所提方法的有效性和稳定性。此外,文档还列举了大量相关的科研方向和技术应用,涵盖智能优化算法、机器学习、电力系统、路径规划等多个领域,展示了该技术的广泛应用前景。; 适合人群:具备一定自动控制理论基础和Matlab编程能力的研究生、科研人员及工程技术人员,特别是从事智能控制、非线性系统控制及相关领域的研究人员; 使用场景及目标:①学习和掌握RBF神经网络与滑模控制相结合的自适应控制策略设计方法;②应用于电机控制、机器人轨迹跟踪、电力电子系统等存在模型不确定性或外界扰动的实际控制系统中,提升控制精度与鲁棒性; 阅读建议:建议读者结合提供的Matlab代码进行仿真实践,深入理解算法实现细节,同时可参考文中提及的相关技术方向拓展研究思路,注重理论分析与仿真验证相结合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值