D. Slime(贪心,思维)

, 4 模拟一下,比如4个数

a , b , c , d a,b,c,d

. b c , d , a b , a a b + c + d Ⅰ.b吃c,吃d,然后a吃b,最后a能力是a-b+c+d

. a b , c , d a , d d + c + b a Ⅱ.a吃b,吃c,然后d吃a,最后d能力是d+c+b-a

1 , 1 可以发现减号至少有1个,加号至少有1个

, 如果你认真去构造,会发现只要满足有减号和加号

. 任意一种情况的能力值都可以构造出来.

. . . q w 至于为什么一定有加号和减号...加号因为第一步是q-w

q , w , , q w q是正数,w是负数,那么以后不管是减去还是被减,q和w都是异号的

a , , \color{Red}所以把数组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;
}

猜你喜欢

转载自blog.csdn.net/jziwjxjd/article/details/106858999