有以下三种情况:
- 只有一个数,直接输出。
- 有正数也有复数,那就先让负数撞正数得到更小的负数,直到剩下最后一个正数撞所有的负数,答案是所有数的绝对值之和。
- 仅有正数或者仅有负数,就先找一对不相等的相邻的数$x$和$y$来得到另外一个符号的数,回到第二种情况,答案是绝对值之和$-left|x ight|-left|y ight|+left|x-y ight|$。那么只要后面这串式子最大即可。
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #define IL inline #define RG register using namespace std; typedef long long LL; #define RI RG int #define RC RG char const int N=5e5; int n; LL a[N+3]; int main(){ scanf("%d",&n); for(RI i=1;i<=n;i++) scanf("%lld",&a[i]); if(n==1){ printf("%lld",a[1]); return 0; } LL s=0; int c=0; for(RI i=1;i<=n;i++){ s+=abs(a[i]); c+=(a[i]>0); } if(c!=0&&c!=n){ printf("%lld",s); return 0; } LL x=-1LL<<60; for(RI i=2;i<n;i++) x=max(x,abs(a[i]-a[i+1])-abs(a[i])-abs(a[i+1])); printf("%lld",s+x); return 0; }