看不懂退役学姐的代码,求教
查看原帖
看不懂退役学姐的代码,求教
538899
jia_hua_wu楼主2022/11/23 19:50

注:本代码已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;
}
2022/11/23 19:50
加载中...