题目描述如下
这道题的数据范围很小,可以考虑暴力循环,但是如何循环一个区间呢?这时想着构建一个区间。
因为区间需要有左右界限(可变),并且要有一个指针遍历这个区间,所以自然想到用i和j来作为左右区间,再用k循环遍历区间,虽然是O(N*3)的复杂度,但数据很很小可以一试
下一个问题是怎么找次大值,第一想法当然是sort从i到j这个区间,但是这样数组就发生变化了,加上笔者写sort(a[i],a[j])报错(太菜不会写别的),就不得不寻找其他方法曲线救国
寻找次大值只需找到最大值,然后判断a[k]<max并且a[k]>=次大值;就可以了。
有个小细节,找最大值的时候要记得同时维护次大值,先让max1=max,再让max=a[k]
ac代码如下:
#include <bits/stdc++.h>
using namespace std;
const int N=1e3+10;
#define int long long
int n,sum;
int a[N];
void solve(){
int max=0,max1=0;
int sum=0;
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
for(int k=i;k<=j;k++){
if(a[k]>=max){
max1=max;
max=a[k];
}
if(a[k]<max&&a[k]>=max1) max1=a[k];
}
sum=sum+max1;
max=0,max1=0;
}
}
cout<<sum;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
solve();
return 0;
}