注:本代码已AC此题
另:本代码所使用的方法翻遍了题解都没找到
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+100;
int ans=2e9,n,cnt[N],num=0;
int k[N],op[N],a[N];
struct no{
int cn;
int count;
}b[N];
void print(){
//for(int i=1;i<=11;i++) printf("%d",k[i]);printf("\n");
op[1]=a[1];
for(int i=2;i<=n;i++) op[i]=op[i-1]+k[i];
int tot=0,s=0;
for(int i=1;i<=n;i++) tot+=n*op[i]*op[i],s+=op[i];
ans=min(ans,tot-s*s);
}
void dfs(int w,int L,int R){
//printf("%d %d\n",L,R);
if(!w){
for(int j=L;j<=R;j++) k[j]=0;
print();
return;
}
for(int i=0;i<=b[w].count;i++){
for(int j=L;j<=R;j++) k[j]=b[w].cn;
dfs(w-1,L+i,(R-b[w].count+i));
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
if(i>1) cnt[a[i]-a[i-1]]++;
}
for(int i=1;i<=600;i++)
if(cnt[i]){
b[++num].cn=i;
b[num].count=cnt[i];
}
//for(int i=1;i<=12;i++) printf("%d %d\n",b[i].cn,b[i].count);
dfs(num,2,n);
printf("%d\n",ans);
return 0;
}