Skip to content
Author: loop3r
Date: 20250916
tag: 反悔贪心
link: https://codeforces.com/problemset/problem/865/D

问题描述

link

分析

考虑当 i<j<kpi<pj<pk

  1. 如果在第 i 天买入,在第 j 天卖出,利润为 pjpi
  2. 如果在第 j 天买入,在第 k 天卖出,利润为 pkpj

贪心策略:如果当天有利可图则卖出,同时买入当天的股票,等候后面上涨时卖出。有 (pjpi)+(pkpj)=pkpi,等价于第 j 天没有交易。

参考代码

cpp
#include <bits/stdc++.h>
using namespace std;

const int N = 3e5 + 10;
int n, p[N];

int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> p[i];

    priority_queue<int, vector<int>, greater<int>> q;

    long long ans = 0;
    for (int i = 1; i <= n; i++) {
        if (q.size() && q.top() < p[i]) {
            ans += p[i] - q.top();
            q.pop();
            q.push(p[i]);
        }
        q.push(p[i]);
    }
    cout << ans << endl;

    return 0;
}