Codeforces Round #437 (Div. 2, based on MemSQL Start[c]UP 3.0 - Round 2) E. Buy Low Sell High [贪心 II...

题目:http://codeforces.com/contest/867/problem/E

题意:模拟股票操作,每天只能买一只股票或者卖一只股票或者什么也不做,求最大利润。

题解:仔细想想是非常简单的一个贪心问题,理解为连续的多次贪心买入卖出可以合并为一次的买入卖出,且值为最优。只需要用一个最小堆每次寻找前面的最小且没有被标记为购买点的值即可。如果自己为最小值,continue。如果那个值没有被选过,为买入点,pop。如果那个值被选为了售出的点,那么取消售出的标记,把当前点标记为售出点,利润直接加为和堆顶的差值。

#include<bits/stdc++.h>
#define pii pair<int, int>
#define mod 1000000007
#define mp make_pair
#define pi acos(-1)
#define eps 0.00000001
#define mst(a,i) memset(a,i,sizeof(a))
#define all(n) n.begin(),n.end()
#define lson(x) ((x<<1))
#define rson(x) ((x<<1)|1)
#define inf 0x3f3f3f3f
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
const int maxn = 3e5+5;
priority_queue<pii,vector<pii>,greater<pii>>a;
int has[maxn];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    int i, j, k, m, n;
    cin>>n;
    ll ans =0;
    for(int i=  1;i<=n;++i)
    {
        cin>>k;
        a.push(mp(k,i));
        if(a.top().first>=k)continue;
        ans+=k-a.top().first;
        if(!has[a.top().second])
        {
            a.pop();
            has[i]=1;
        }
        else{
            has[a.top().second]=0;
            has[i]=1;
        }
    }
    cout<<ans<<endl;
    return 0;
}

 

转载于:https://www.cnblogs.com/Meternal/p/7911312.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值