【题意】已知n天股价,每天可以买入一股或卖出一股或不作为,最后必须持0股,求最大收益。
【算法】堆 贪心?
【题解】
不作为思想:【不作为=买入再卖出】
根据不作为思想,可以推出中转站思想。
中转站思想:【买卖可以借助中转站,差值累加】
做法:从左到右,每次将两个-v加入堆,然后取大堆顶出来组成买卖。
理解:每个数字都和前面一个数字配对,然后在堆中留下两个数字,第一次访问表示转为中转站,第二次访问表示买该数字。
特别地,当前面没有比它小的数字时,会和自己组成买卖,就直接省去中转站功能。
★其实这种思想相当于贪心思想中在堆里加入反悔元素的行为,先卖这个数字得到眼前利益,后面不行再转成不作为的中转站,不行再买这个数字。
因为操作有三种,所以就需要在堆中加入两个-v来反悔。嗯,这样解释就通俗多了QAQ
#include<cstdio>
#include<queue>
using namespace std;
priority_queue<int>q;
int n;long long ans;
int main(){
scanf("%d",&n);int u;
for(int i=;i<=n;i++){
scanf("%d",&u);
q.push(-u);q.push(-u);
ans+=u+q.top();
q.pop();
}
printf("%I64d",ans);
return ;
}