本文主要是介绍Codeforce 867E(贪心),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题意:假设初始有无限的钱,给出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;
}
这篇关于Codeforce 867E(贪心)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!