[NOIP2021] 方差
记差分数组为
全部加上一个数,方差不变,可以不管
令
答案为
只能找性质了,可以发现
那么从小到大排序,每次只能添加到序列的开头或结尾
设
由于
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m,a[10001];
ll s=1e18,k,d[10001],dp[500001];
int main(){
for(int i=1;i<=500000;i++) dp[i]=1e16;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]),m=max(m,a[i]*n);
for(int i=1;i<n;i++) d[i]=a[i+1]-a[i];
sort(d+1,d+n);
for(ll i=1;i<n;i++){
if(!d[i]) continue;
k+=d[i];
for(ll j=m;j>=0;j--){
if(j+k<=m) dp[j+k]=min(dp[j+k],dp[j]+k*k);
if(j+i*d[i]<=m) dp[j+i*d[i]]=min(dp[j+i*d[i]],dp[j]+2*d[i]*j+i*d[i]*d[i]);
dp[j]=1e16;
}
}
for(ll i=0;i<=m;i++) s=min(s,n*dp[i]-i*i);
printf("%lld",s);
return 0;
}