杂题选讲 2 Buy Low Sell High

题目
本题是一个反悔贪心题
贪心很容易理解,反悔就非常神奇了
举个例子

3
1 2 100
当价格为1时买入,价格为2时卖出,显然不是最优解,因此我们需要反悔,
在价格为2时不卖了。

那如何实现呢?
仔细想想,如果反悔,会多盈利100-2=98
因此,我们将2加入我们的小根堆里,就可以实现反悔操作

为什么2要入堆两次呢,一个是原数,即你有可能以这个价格买入,另一个是反悔用的,即你是在第一天买入的,第二天卖出,当遇到更高的价格时,
反悔,不在第二天卖了,那个就会获得第三天与第二天的价格差,也就是盈利会增加多少。

不需要担心在这天既买又卖,如果是在这天买的话,它前面肯定已经反悔了,不然轮不到它在堆顶。
好分析完了,我们来看代码部分

#include<queue>
#include<cstdio>
using namespace std;
priority_queue<int ,vector<int> ,greater<int> >p;
int main()
{
	long long ans=0;
	int n,a;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a);
		if(!p.empty()&&p.top()<a){
			ans+=(a-p.top());
			p.pop();
			p.push(a);
		}
		p.push(a);
	}
	cout<<ans;
}```
posted @ 2021-04-13 17:20  S_Curry  阅读(69)  评论(1编辑  收藏  举报