输入一段队列,让你将这个队列变成非递减或非递增耗费的代价的最少值。

典型优先队列,从头和从尾扫一遍,比较俩个代价的最小值
#include <bits/stdc++.h>
using namespace std;
#define ll long long
priority_queue<int> p1,p2;//优先队列初始是按照升序排列的
int n;
ll a[2001];
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&a[i]);
    }
    ll ans1 = 0,ans2 = 0;
    for(int i=1;i<=n;i++)
    {
        p1.push(a[i]);
        if(p1.top() > a[i])
        {
            ans1 += (p1.top()-a[i]);
            p1.pop();
            p1.push(a[i]);
        }
    }
    for(int i=n;i>=1;i--)
    {
        p2.push(a[i]);
        if(p2.top() > a[i])
        {
            ans2 += (p2.top()-a[i]);
            p2.pop();
            p2.push(a[i]);
        }
    }
    cout<<min(ans1,ans2)<<endl;
    return 0;
}