首页 > 其他 > 详细

ARC121D - 1 or 2

时间:2021-05-30 22:53:04      阅读:24      评论:0      收藏:0      [点我收藏+]

ARC121D - 1 or 2

题目大意

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

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

最小化分组的权值


分析

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

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

对于有1的情况,向原数组中加入若干1即可


#include<bits/stdc++.h>
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);
}

ARC121D - 1 or 2

原文:https://www.cnblogs.com/chasedeath/p/14829035.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!