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;
}
View Code

 

以上是关于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(代码片

usaco 4.3 Buy Low, Buy Lower

D. Buy Low Sell High

Codeforces 938D Buy a Ticket spfa优化

Educational Codeforces Round 38D. Buy a Ticket 堆优化Dijkstra