题解保对(加缩进版)
2024-04-05 22:01:02
发布于:广东
52阅读
0回复
0点赞
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> //你好
using namespace std;
const int M = 10005;
#define int long long
const int inf = 0x3f3f3f3f3f3f3f3f;
int read()
{
int x=0,f=1;char c;
while((c=getchar())<'0' || c>'9') {if(c=='-') f=-1;}
while(c>='0' && c<='9') {x=(x<<3)+(x<<1)+(c^48);c=getchar();}
return x*f;
}
int n,z,a[M],b[M],s[M],dp[2][M*55];
void upd(int &x,int y) {x=min(x,y);}
signed main()
{
n=read();
for(int i=1;i<=n;i++) a[i]=read();
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++) s[i]=s[i-1]+b[i];
for(z=1;z<n && b[z]==0;z++);
memset(dp,0x3f,sizeof dp);
dp[(z-1)&1][0]=0;
for(int i=z;i<n;i++)
{
int w=i&1;
for(int j=0;j<=a[n]*n;j++) dp[w][j]=inf;
for(int j=0;j<=a[n]*n;j++) if(dp[w^1][j]<inf)
{
upd(dp[w][j+b[i]*i],dp[w^1][j]
+2*j*b[i]+b[i]*b[i]*i);
upd(dp[w][j+s[i]],dp[w^1][j]+s[i]*s[i]);
}
}
int ans=inf;
for(int j=0;j<=a[n]*n;j++) if(dp[(n-1)&1][j]<inf)
upd(ans,n*dp[(n-1)&1][j]-j*j);
printf("%lld\n",ans);
}
全部评论 2
1ms/11.84m
#4
AC
0ms/11.69m
#5
AC
1ms/11.72m
#6
AC
0ms/11.82m
#7
AC
1ms/11.75m
#8
AC
2ms/11.79m
#9
AC
0ms/11.74m
#10
AC
0ms/11.72m
#11
AC
35ms/11.71m
#12
AC
1ms/11.75m
#13
AC
36ms/11.84m
#14
AC
33ms/11.63m
#15
AC
33ms/11.76m
#16
AC
23ms/11.98m
#17
AC
23ms/12.04m
#18
AC
0ms/11.72m
#19
AC
0ms/11.75m
#20
AC
0ms/11.68m
#21
AC
0ms/11.77m
#22
AC
1ms/11.82m
#23
AC
1ms/11.76m
#24
AC
1ms/11.73m
首页
方差-省选/NOI-详细题解-ACGO题库2024-09-20 来自 山东
0希望我的题解对你有帮助......
2024-04-05 来自 广东
0
有帮助,赞一个