2022年码蹄杯真题 项链 题型:数论

102 阅读2分钟

码题集OJ-项链 (matiji.net)

思想

image.png

上面这个公式的意思是:

a1a2+a2a3+a3a4+a4a5++ana1|a1-a2|+|a2-a3|+|a3-a4|+|a4-a5|+……+|an-a1|

我们去掉绝对值括号之后化为:

±(a1a2)±(a2a3)±(a3a4)±(a4a5)±±(ana1)\pm(a1-a2)\pm(a2-a3)\pm(a3-a4)\pm(a4-a5)\pm……\pm(an-a1)

我们发现所有的数都出现了两次,于是可以化为:

2(±a1±a2±a3±a4±a5±±an)2(\pm a1 \pm a2 \pm a3 \pm a4 \pm a5 \pm …… \pm an)

其中我们a1加到an一共n个数,再乘以2,一共2n个数。其中+ -号格占了一半,于是可以再分为:

a1+a2+a3+a4+a5+……+an
a1-a2-a3-a4-a5-……-an

即:

image.png

题目要求我们求最大值,我们用相加和最大的n个数减去相加和最小和-n个数,这样得到的价值最大:

假设这n个数是

1 2 3 4 5 6

2n个数就是:

1 2 3 4 5 6
-1 -2 -3 -4 -5 -6

那么可以进行如下操作:

[2(4+5+6)+(1)+(2)+(3)][2(4+5+6)+(-1)+(-2)+(-3)]

变为:

[2(4+5+6)(1+2+3)][2(4+5+6)-(1+2+3)]

上面举的"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

我们可以在前半部分中间值加上,后半部分把中间值加上。这样就可以把中间值消掉了。

我们可以用2[(3+4+5)(1+2+3+4)]2[(3+4+5)-(1+2+3+4)]

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;
}

image.png