Bashar and Hamada
题意:f[s]表示选定数组的一个子集,使得子集里面的所有数的差的绝对值最大。
思路:可以看出当k选2时,肯定是最大值减最小值最大,那么k等于3呢,我们加进来一个第二小,k=4呢,加一个第二大的。由此往复最后结果最优。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[300005];
ll pre[300005],sum[300005];
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
sort(a+1,a+n+1);
pre[0]=0,sum[n+1]=0;
pre[1]=a[1],sum[n]=a[n];
for(int i=2;i<=n;i++)
pre[i]=pre[i-1]+a[i];
for(int i=n-1;i>=1;i--)
sum[i]=sum[i+1]+a[i];
int l=1,r=n;
int f=0;
ll ans=0;
while(l<r){
if(f==0)
ans+=1ll*(l-1)*a[l]-pre[l-1]+sum[r]-1ll*l*a[l];
else ans+=sum[r+1]-1ll*(n-r)*a[r]+1ll*l*a[r]-pre[l];
printf("%lld ",ans);
if(f==0){
r--;
f=!f;
}
else{
l++;
f=!f;
}
}
}