分级

题目描述

给定长度为 \(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;
}
posted @ 2022-10-17 21:53  FighterQ  阅读(75)  评论(0)    收藏  举报