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