模拟一下,比如4个数
a,b,c,d
Ⅰ.b吃c,吃d,然后a吃b,最后a能力是a−b+c+d
Ⅱ.a吃b,吃c,然后d吃a,最后d能力是d+c+b−a
可以发现减号至少有1个,加号至少有1个
如果你认真去构造,会发现只要满足有减号和加号
任意一种情况的能力值都可以构造出来.
至于为什么一定有加号和减号...加号因为第一步是q−w
q是正数,w是负数,那么以后不管是减去还是被减,q和w都是异号的
所以把数组a排序,正数就加上,负数就减去
如果全是负数说明我们始终在减,这时候要加上最大的负数
如果全是正数说明我们始终在加,这时候要减去最小的正数
注意特判n==1的情况,很容易考虑不到!!!
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=500009;
int n,m,ans,w,q,a[maxn];
signed main()
{
cin >> n;
for(int i=1;i<=n;i++) cin >> a[i];
sort(a+1,a+1+n);
if(n==1){
cout<<a[1];
return 0;
}
for(int i=1;i<=n;i++)
{
if(a[i]>0) ans+=a[i],q++;
else if(a[i]==0) continue;
else ans-=a[i],w++;
}
if(q==n) ans-=2*a[1];//至少要减去一个 ,减最小的
else if(w==n) ans+=2*a[n];//至少要加上一个,加最大的
cout<<ans;
}