思想
上面这个公式的意思是:
我们去掉绝对值括号之后化为:
我们发现所有的数都出现了两次,于是可以化为:
其中我们a1加到an一共n个数,再乘以2,一共2n个数。其中+ -号格占了一半,于是可以再分为:
a1+a2+a3+a4+a5+……+an
a1-a2-a3-a4-a5-……-an
即:
题目要求我们求最大值,我们用相加和最大的n个数减去相加和最小和-n个数,这样得到的价值最大:
假设这n个数是
1 2 3 4 5 6
2n个数就是:
1 2 3 4 5 6
-1 -2 -3 -4 -5 -6
那么可以进行如下操作:
变为:
上面举的"123456"是n为偶数的情况,那么n为奇数的情况呢,比如n个数如下:
1 2 3 4 5
那么2n个数就是
1 2 3 4 5
-1 -2 -3 -4 -5
那么 1 2一共出现了4次,分别是:
1 2 -1 -2
4 5也出现了4次,分别是:
4 5 -4 -5
1 2 4 5一共出现了8次,还有两次分别是3出现了2次:
3 -3
我们可以在前半部分中间值加上,后半部分把中间值加上。这样就可以把中间值消掉了。
我们可以用
code
#include<bits/stdc++.h>
using namespace std;
int n;
const int N=3e5+10;
int a[N];
int sum1,sum2;
int main()
{
cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
sort(a,a+n);
if(n&1) //奇数的情况
{ //12345
for(int i=0;i<=n/2;i++) //可以取到3
{
sum1+=a[i];
}
for(int i=n/2;i<n;i++) //从3开始取
{
sum2+=a[i];
}
}
else //偶数的情况
{ //123456
for(int i=0;i<n/2;i++) //可以取到3
{
sum1+=a[i];
}
for(int i=n/2;i<n;i++) //从4开始取
{
sum2+=a[i];
}
}
cout<<2*(sum2-sum1);
return 0;
}