CF867E: Buy Low Sell High(贪心, STL) (hdu6438)
Description
有nn个城市,第ii个城市商品价格为aiai,从11城市出发依次经过这nn个城市到达n
n城市,在每个城市可以把手头商品出售也可以至多买一个商品,问最大收益。
Input
第一行一整数T
T表示用例组数,每组用例首先输入一整数nn表示城市数量,之后输出nn个整数ai
ai表示每个城市商品单价
(1≤T
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; }
It is your time to fight!