CodeForces866D. Buy Low Sell High
Posted ONION_CYC
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CodeForces866D. Buy Low Sell High相关的知识,希望对你有一定的参考价值。
【题意】已知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=1;i<=n;i++){ scanf("%d",&u); q.push(-u);q.push(-u); ans+=u+q.top(); q.pop(); } printf("%I64d",ans); return 0; }
以上是关于CodeForces866D. Buy Low Sell High的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #437 (Div. 2, based on MemSQL Start[c]UP 3.0 - Round 2) E. Buy Low Sell High [贪心 II
Codeforces Round #437 (Div. 2, based on MemSQL Start[c]UP 3.0 - Round 2) E. Buy Low Sell High(代码片