分级
题目描述
给定长度为 \(N\) 的序列 \(A\),构造一个长度为 \(N\) 的序列 \(B\),满足:
\(1.\)\(B\) 非严格单调,即 \(B1 \leq B2 \leq … \leq B_N\) 或 \(B1 \geq B2 \geq … \geq BN。\)
\(2.\)最小化 \(S=\sum_{i=1}^{N}|Ai−Bi|。\)
只需要求出这个最小值 \(S\)
输入格式
第一行包含一个整数 \(N\)。
接下来 \(N\) 行,每行包含一个整数 \(A_i\)。
输出格式
输出一个整数,表示最小 \(S\) 值。
输入样例:
7
1 3 2 4 5 3 9
输出样例:
3
数据范围
\(1 \leq N \leq 2000,\)
\(0 \leq A_i \leq 10^6\)
Solution
Code:
#include <iostream>
#include <algorithm>
using namespace std;
const int N=2005,INF=0x3f3f3f3f;
int n;
int a[N],b[N];
int f[N][N];
int work()
{
for(int i=1;i<=n;++i)
{
int minv=INF;
for(int j=1;j<=n;++j)
{
minv=min(minv,f[i-1][j]);
f[i][j]=minv+abs(a[i]-b[j]);
}
}
int res=INF;
for(int i=1;i<=n;++i)
res=min(res,f[n][i]);
return res;
}
int main()
{
cin>>n;
for(int i=1;i<=n;++i)cin>>a[i],b[i]=a[i];
sort(b+1,b+n+1);
int res=work();
reverse(b+1,b+n+1);
res=min(res,work());
cout<<res<<endl;
return 0;
}

浙公网安备 33010602011771号