CF865D Buy Low Sell High 题解 贪心

题目链接:https://www.luogu.com.cn/problem/CF865D

题解完全参照自 SJC_03大佬的博客

这里有一个我思考了很久的问题(大佬一眼就能看出来):

假设堆顶元素是 (p_i),当前元素是 (p_j(p_j gt p_i)),则将 (p_j - p_i) 加入答案同时将 (p_j) 入堆,那为什么还需要将 (p_j) 在此入堆,这不是入堆两次了么?

是这样的,入堆两次保证第 (j) 天最终是卖的,接下来用到过一次 (p_j) 说明第 (j) 天不买也不卖,用到过两次 (p_j) 说明第 (j) 天是买的。神奇!!

示例代码:

#include <bits/stdc++.h>
using namespace std;
int n, a;
long long ans;
priority_queue<int, vector<int>, greater<int> > que;
int main() {
    scanf("%d", &n);
    while (n --) {
        scanf("%d", &a);
        if (!que.empty() && que.top() < a) {
            ans += a - que.top();
            que.pop();
            que.push(a);
        }
        que.push(a);
    }
    printf("%lld
", ans);
    return 0;
}
原文地址:https://www.cnblogs.com/quanjun/p/13758843.html