2 条题解
-
0
#include<bits/stdc++.h> using namespace std; typedef long long LL; const int N=2100; LL f[N][N];//f[i][j]表示B[i]=b[j]的情况下,∑|A[1..i]-B[1..i]|最小值 LL a[N],b[N]; int main() { int n;scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%lld",&a[i]),b[i]=a[i]; sort(b+1,b+n+1); memset(f[0],0,sizeof(f[0])); for(int i=1;i<=n;i++) { LL val=1ll<<60; for(int j=1;j<=n;j++) { val=min(val,f[i-1][j]); f[i][j]=val+abs(a[i]-b[j]); } } LL ans=1ll<<60;; for(int j=1;j<=n;j++)ans=min(ans,f[n][j]); memset(f,0,sizeof(f)); for(int i=1;i<=n;i++) { LL val=1ll<<60; for(int j=1;j<=n;j++) { val=min(val,f[i-1][j]); f[i][j]=val+abs(a[i]-b[n-j+1]); } } for(int j=1;j<=n;j++)ans=min(ans,f[n][j]); printf("%lld\n",ans); return 0; } -
0
#include<bits/stdc++.h> using namespace std; typedef long long LL; const int N=2100; LL f[N][N];//f[i][j]表示B[i]=b[j]的情况下,∑|A[1..i]-B[1..i]|最小值 LL a[N],b[N]; int main() { int n;scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%lld",&a[i]),b[i]=a[i]; sort(b+1,b+n+1); memset(f[0],0,sizeof(f[0])); for(int i=1;i<=n;i++) { LL val=1ll<<60; for(int j=1;j<=n;j++) { val=min(val,f[i-1][j]); f[i][j]=val+abs(a[i]-b[j]); } } LL ans=1ll<<60;; for(int j=1;j<=n;j++)ans=min(ans,f[n][j]); memset(f,0,sizeof(f)); for(int i=1;i<=n;i++) { LL val=1ll<<60; for(int j=1;j<=n;j++) { val=min(val,f[i-1][j]); f[i][j]=val+abs(a[i]-b[n-j+1]); } } for(int j=1;j<=n;j++)ans=min(ans,f[n][j]); printf("%lld\n",ans); return 0; }
- 1
信息
- ID
- 1360
- 时间
- 1000ms
- 内存
- 64MiB
- 难度
- 7
- 标签
- 递交数
- 111
- 已通过
- 26
- 上传者