杂题选讲 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;
}```