输入一段队列,让你将这个队列变成非递减或非递增耗费的代价的最少值。
典型优先队列,从头和从尾扫一遍,比较俩个代价的最小值
#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;
} 
京公网安备 11010502036488号