#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
using namespace std;
const int M =101000;
long n;
long long a[M],f[M],g[M]; // f[i] 1~i中相邻差的最大值 g[i] i~n中相邻差最大值
int main() // 删除i后 数列相邻差最大值为 ans=max(abs(a[i-1]-a[i+1],f[i-1],g[i+1])
{
int t;
cin>>t;
while(t--)
{
cin>>n;
memset(f,0,sizeof(f));
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
if(i>=2)
f[i]=max(abs(a[i]-a[i-1]),f[i-1]);
}
memset(g,0,sizeof(g)); //
for(int i=n-1;i>=1;i--)
{
g[i]=max(g[i+1],abs(a[i]-a[i+1]));
}
long long ans=0;
for(int i=1;i<=n;i++)
{
if(i==1)
ans+=g[2]; //删掉1
else if(i==n)
ans+=f[n-1];//删掉n
else
{
long long k1=max(f[i-1],g[i+1]);
long long k2=abs(a[i-1]-a[i+1]);
ans+=max(k1,k2);
}
}
cout<<ans<<endl;
}
return 0;
}
hdu 5805 简单思维题
最新推荐文章于 2020-04-13 07:19:26 发布