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\n", ans);
return 0;
}