萌新求助
查看原帖
萌新求助
233462
Umbrella_Leaf楼主2021/11/22 22:12

不知为何,小样例都能过,大样例答案错误。民间数据评测也是小数据全过,而最后 66 个点 WA。

求高人帮忙指点下,谢谢!

#include<bits/stdc++.h>
using namespace std;
#define ll long long
bool s;
int n;
ll a[10005],b[10005],c[10005];
ll dp[2][500005];
bool t;
int main(){
//	freopen("variance4.in","r",stdin);
//	printf("%.2lf\n",(&t-&s)/1024.0/1024.0);
	scanf("%d",&n);
	for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
	for(int i=1;i<n;i++)
		b[i]=a[i+1]-a[i];
	sort(b+1,b+n);
	for(int i=1;i<n;i++)c[i]=c[i-1]+b[i];
	int st=1;
	while(b[st]==0&&st<n)st++;
	if(st==n){
		puts("0");
		return 0;
	}
	memset(dp,0x3f,sizeof(dp));
	dp[0][0]=0;
	for(int i=st,now=1;i<n;i++,now^=1){
		memset(dp[now],0x3f,sizeof(dp[now]));
		for(int j=0;j<=n*a[n];j++)
			if(dp[now^1][j]<0x3f3f3f3f3f3f3f3f){
				dp[now][j+c[i]]=min(dp[now][j+c[i]],dp[now^1][j]+c[i]*c[i]);
				dp[now][j+i*b[i]]=min(dp[now][j+i*b[i]],dp[now^1][j]+2*b[i]*j+i*b[i]*b[i]);
			}
	}
	ll ans=0x3f3f3f3f3f3f3f3f;
	for(int j=0;j<=n*a[n];j++)
		if(dp[(n-st)&1][j]<0x3f3f3f3f3f3f3f3f){
			ans=min(ans,n*dp[(n-st)&1][j]-j*j);
		}
	printf("%lld\n",ans);
	return 0;
}
2021/11/22 22:12
加载中...