蓝桥杯的题还是有难题的。这道题的可行性证明比较麻烦,但是代码比较简单。
学到了新的序列操作。前缀和的应用,前缀和还是学的不够扎实,晚上再复习一遍。

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
#define ls (p<<1)
#define rs (p<<1|1)
#define mid (l+r)/2
#define over(i,s,t) for(int i=s;i<=t;++i)
#define lver(i,t,s) for(int i=t;i>=s;--i)
using namespace std;
typedef long long ll;
const ll N=3e5+7;
const ll INF=1e13+7;
const ll mod=2147483647;
const double EPS=1e-6;
ll n,m,t;
bool vis[N];
ll a[N],s[N],b[N];
int main()
{
    scanf("%lld",&t);
    while(t--)
    {
        memset(vis,0,sizeof vis);
        s[0]=0;
        scanf("%lld",&n);
        over(i,1,n)scanf("%lld",&b[i]);
        over(i,1,n)s[i]=s[i-1]+b[i];
        ll st=s[0],se=s[n];//s[n]是不能变的
        if(st>se)swap(st,se);
        sort(s,s+1+n);
        over(i,0,n)
        {
            if(s[i]==st)
            {
                st=i;
                break;
            }
        }
        lver(i,n,0)
        {
            if(s[i]==se)
            {
                se=i;
                break;
            }
        }
        ll l=0,r=n;
        for(int i=st;i>=0;i-=2)
            a[l++]=s[i],vis[i]=true;
        for(int i=se;i<=n;i+=2)
            a[r--]=s[i],vis[i]=true;
        over(i,0,n)
        if(!vis[i])
            a[l++]=s[i];
        ll res=0;
        over(i,1,n)
        res=max(res,abs(a[i]-a[i-1]));
        printf("%lld\n",res);
    }
    return 0;
}

详解链接