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