ARC121D - 1 or 2


ARC121D - 1 or 2

题目大意

给定\(n\)个数,现对其分组,每组\(1-2\)个数

设每个分组内数的和为\(s_i\),定义一个分组的权值为\(\max\{s_i\}-\min\{s_i\}\)

最小化分组的权值


分析

当时我就被这玩意儿侮辱了

如果每组数都要求拿两个,那么显然最优分组就是头尾匹配

对于有1的情况,认为是和一个额外的0匹配,向原数组中加入若干0即可


#include
using namespace std;
const int N=100010;
int n,a[N],b[N];
typedef long long ll;
ll Solve(int *a,int n){
	if(n&1) return 1e18;
	ll mi=1e18,ma=-1e18;
	for(int i=1;i*2<=n;++i) {
		mi=min(mi,(ll)a[i]+a[n-i+1]);
		ma=max(ma,(ll)a[i]+a[n-i+1]);
	}
	return ma-mi;
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;++i) scanf("%d",a+i);
	sort(a+1,a+n+1);
	ll ans=1e18;
	for(int i=0;i<=n;++i) if(~(n+i)&1) {
		int m=0;
		for(int j=1;j<=n;++j) if(a[j]<=0) b[++m]=a[j];
		for(int j=1;j<=i;++j) b[++m]=0;
		for(int j=1;j<=n;++j) if(a[j]>0) b[++m]=a[j];
		ans=min(ans,Solve(b,m));
	}
	printf("%lld\n",ans);
}