洛谷題目翻譯
假設每天都買,到最後的時候,所有沒賣出去的郵票都可以原價出售(相當於沒買).每到新的一天,如果當前的價錢比以前某賣出的一天高,那就用今天賣前面那天的股票.
如果不存在上一行的情況且今天的價錢比我已經買了且沒賣的最便宜的股票高,那我就把最便宜的那股賣了.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int n;
long long p[300001],ans;
priority_queue<long long ,vector<long long>,greater<long long> > q,q1;
int main() {
scanf("%d",&n);
for(int i = 1;i <= n; i++)
scanf("%lld",&p[i]);
q.push(p[1]);
for(int i = 2;i <= n; i++) {
if(q.empty()) {
q.push(p[i]);
int u = q1.top();
if(p[i] > u) {
ans = ans + p[i] - u;
q1.pop();
q1.push(p[i]);
}
}
else {
if(q1.empty()) {
if(p[i] - q.top() > 0) {
ans += p[i] - q.top();
q.pop();
q1.push(p[i]);
}
q.push(p[i]);
continue;
}
if(p[i] - q.top() > 0) {
if(p[i] - q1.top() > p[i] - q.top()) {
int v = q1.top();
ans += p[i] - v;
q.push(p[i]);
q1.pop();
q1.push(p[i]);
}
else {
ans += p[i] - q.top();
q.pop();
q.push(p[i]);
q1.push(p[i]);
}
}
else {
if(p[i] - q1.top() > 0) {
ans += p[i] - q1.top();
q1.pop();
q1.push(p[i]);
}
q.push(p[i]);
}
}
}
printf("%lld",ans);
return 0;
}