GG
每次都是在笔试完之后知道怎么做
还在想用线段树做
确实捞啊
题意
给定一个数组
求有序三元组(ai < aj < ak,i < j < k)的最大和
例如 A = [1 , 2, 3, 4, 5]
最大的三元组就是(3,4,5)
题解
单调栈
每次值进入一个栈的时候,只有栈顶的元素小于当前值才能入栈
将ans与栈中三个值和做比较选出最大值
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 1000 + 10;
int v[maxn];
int main(){
int N;
scanf("%d",&N);
for(int i = 0;i < N;++i){
scanf("%d", &v[i]);
}
int ans = 0;
int ss[1000 + 10] = {0};
int top = 0;
for(int i = 0;i < N;++i){
while(top && ss[top - 1] > v[i]) top--;
ss[top++] = v[i];
if(top >= 3){
int tmpres = ss[top - 1] + ss[top - 2] + ss[top - 3];
ans = max(tmpres, ans);
}
}
printf("%d",ans);
return 0;
}