优先队列 Making the Grade

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

典型优先队列,从头和从尾扫一遍,比较俩个代价的最小值
#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;
}


全部评论

相关推荐

05-26 10:24
门头沟学院 Java
qq乃乃好喝到咩噗茶:其实是对的,线上面试容易被人当野怪刷了
找工作时遇到的神仙HR
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务