题目链接:Codeforces - Buy Low Sell High
贪心+反悔自动机。
什么是反悔自动机呢?因为贪心只能得到局部最优解,而不能全局最优解。
所以,对于有些贪心,存在一个反悔操作。使得局部最优=全局最优。
本题也是一样的,我们每次当前的值,可以从小根堆当中取最小的值更新,但是不一定是最优的,因为后面再更新可能值更大。我们就把当前的值重新放回到堆中。第一次取出来代表买入,第二次取出来代表反悔。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e5+10;
int n,res,p[N];
priority_queue<int,vector<int>,greater<int> > q;
signed main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>p[i];
for(int i=1;i<=n;i++){
q.push(p[i]),q.push(p[i]);
res+=p[i]-q.top(); q.pop();
}
cout<<res;
return 0;
}