这道题的核心规律就是,一串数字,里面有正有负,他们最后能达到的值可以是绝对值之和,也可以是负的绝对值之和。
如果只有正数或者只有负数,那就要减掉两倍最小值。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int INF=1e9+7; int a[500010]; int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); if(n==1) { printf("%d ",a[1]); return 0; } int pos=0,neg=0; for(int i=1;i<=n;i++) { if(a[i]>=0) pos++; else neg++; } if(pos==n) { ll res=0; int mina=INF; for(int i=1;i<=n;i++) { mina=min(a[i],mina); res+=a[i]; } res-=2*mina; printf("%lld ",res); return 0; } else if(neg==n) { ll res=0; for(int i=1;i<=n;i++) { a[i]=-a[i]; } int mina=INF; for(int i=1;i<=n;i++) { mina=min(a[i],mina); res+=a[i]; } res-=2*mina; printf("%lld ",res); return 0; } else { ll res=0; for(int i=1;i<=n;i++) res+=abs(a[i]); printf("%lld ",res); return 0; } }