题意:
每次删除任意一个数字,记录最大的差值的绝对值之和。
思路:
第一次写的时候记录最大和次大,然而不对。留组数据
1
3
1 100 2
如果这种写法需要维护第三大。
接下来就是网上各种copy万家的代码了。前数组,后数组,维护
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <cstring>
using namespace std;
long long a[100005];
long long det[100005];
long long det2[100005];
int main()
{
int T;
cin>>T;
while(T--)
{
memset(det,0,sizeof(det));
memset(det2,0,sizeof(det2));
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
for(int i=2;i<=n;i++)
{
long long num=fabs(a[i]-a[i-1]);
det[i]=max(det[i-1],num);
}
for(int i=n-1;i>=1;i--)
{
long long num=fabs(a[i+1]-a[i]);
det2[i]=max(num,det2[i+1]);
}
long long ans=0;
for(int i=1;i<=n;i++)
{
if(i==1)
{
ans+=det2[2];
}
if (i==n)
{
ans+=det[n-1];
}
if( i>1&&i<n)
{
long long num=fabs(a[i+1]-a[i-1]);
ans+=max(max( det[i-1],det2[i+1] ),num );
}
}
cout<<ans<<endl;
}
return 0;
}