分析
赛时想简单了。。先排序,蹲坑想到的做法是一定把最后或者第一个放中间,然后一定有一个最近的和一个极差。
但是在赛后手摸数据的时候发现不对,万一最大那个往前走一个相距很近的点,但是离那个数距离最近的又很远,极差又不会有什么变化,那不就不成立了吗?
于是分类再细一点,把绝对值符号拆开成三种情况(大小关系),一个一个枚举到底哪个才作为中间的量,确定中间的量之后也就可以根据一开始“极差”的思想算出答案,最后取最大值就可以了。
上代码
// LUOGU_RID: 121398710
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
ll n,a[200010];
int main()
{
int T;
cin>>T;
while (T--)
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+n+1);
ll ans=a[n]-a[1];
for(int i=2;i<=n-1;i++)
{
ans=max(ans,a[n]-a[i-1]*2+a[i]);
}
for(int i=3;i<=n;i++)
{
ans=max(ans,a[i]*2-a[i-1]-a[1]);
}
cout<<ans<<endl;
}
return 0;
}