题意:假设初始有无限的钱,给出N天股票的价格,每一天可以买入可以卖出也可以什么都不做,求最大收益是多少,卖出时要保证手中至少有一支股票
链接:点击打开链接
代码:
#include <map>
#include <queue>
#include <string>
#include <math.h>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
const int siz=300005;
int a[siz],b[siz];
struct cmp{
bool operator()(int x,int y){
return a[x]>a[y];
}
};
int main(){
int n,i,u;
long long ans;
while(scanf("%d",&n)!=EOF){
priority_queue<int,vector<int>,cmp> qu;
ans=0;
memset(b,0,sizeof(b));
for(i=1;i<=n;i++){ //qu存的是备选可以买的标号
scanf("%d",&a[i]); //优先级按照价值由小到大
if(i==1||qu.size()==0){ //如果是第一个或者备选为空,就将当前加入备选
qu.push(i);
continue;
}
u=qu.top();
if(a[u]<a[i]){ //如果当前大于最小价值,则可以选择将价值最小元素买入
ans+=(a[i]-a[u]); //当前元素卖出。但可能会出现-1,+2,-2,+3,实际2这个
qu.pop(); //元素是作为过渡元素,实际依然可以作为备选,因此记一下
qu.push(i); //买卖次数,看是否再加入备选
if(b[u]==1){
b[u]++;
qu.push(u);
}
b[i]++;
}
else //如果当前元素较大则直接加入备选
qu.push(i); //主要就是要注意每一次卖出都是从备选中选择一个
} //作为买入
printf("%I64d\n",ans);
}
return 0;
}