【CodeForces】866D. 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

 

posted @ 2017-10-01 11:55  ONION_CYC  阅读(747)  评论(0编辑  收藏  举报