Codeforces - Buy Low Sell High

题目链接: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;
}
发布了579 篇原创文章 · 获赞 242 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_43826249/article/details/104339266
今日推荐