CF867E: Buy Low Sell High(贪心, STL) (hdu6438)

Description

nn个城市,第ii个城市商品价格为aiai,从11城市出发依次经过这nn个城市到达n

n城市,在每个城市可以把手头商品出售也可以至多买一个商品,问最大收益。

Input

第一行一整数T

T表示用例组数,每组用例首先输入一整数nn表示城市数量,之后输出nn个整数ai

ai表示每个城市商品单价

(1T250,1n105,n5105)

Output

输出最大收益

sol:显然是贪心题;不难证明下面的东西是对的。

如果某天的价格不能卖,那么插入队列一次,表示这个价格买。

否则,插入队列两次。其中一次表示它替换掉的买价;另外一次是本身价格买。

(这样的话,我们可以保证当前收益最大,而且由于我们把卖掉的也插入了队列,那么它后面可能会转化为买,所以不影响后面的操作。

(即做到了当前收益最大,而且解决了后效性

#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=2000010;
multiset<int>s;
int a[maxn]; ll ans=0;
int main()
{
    int N,T; T=1;
    scanf("%d",&N);
    rep(i,1,N) scanf("%d",&a[i]);
    rep(i,1,N){
        if(!s.empty()&&*s.begin()<a[i]){
            ans+=a[i]-*s.begin();
            s.insert(a[i]);
            s.erase(s.begin());
        }
        s.insert(a[i]);
    }
    printf("%lld",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/hua-dong/p/10751060.html