【NOIP2016模拟3】量化交易-贪心

Description

applepi训练了一个可以自动在股票市场进行量化交易的模型。通常来说,applepi写出的模型,你懂得,就好比一架印钞机。不过为了谨慎起见,applepi还是想先检查一下模型的效果。
applpie收集了“塞帕思股份(surpass)”在最近的连续N天内的价格。在每一天中,他可以做如下事情之一:
1.睡(把)觉(妹)。
2.以当天的价格作为成交价买入1股“塞帕思”的股票。
3.以当天的价格作为成交价卖出1股“塞帕思”的股票。
最初applepi不持有该股票。现在你需要计算出在最优策略下,N天后applepi能够获得的最大利润。为了维护森林的和平,本着清仓甩锅的原则,在N天的交易结束后applepi也不能持有“塞帕思”的股票。

Input

每个测试点包含若干组数据,以EOF结尾。对于每组数据:
第一行1个整数N。
第二行N个正整数,相邻两个整数之间用1个空格隔开,表示每一天股票的价格。

Output

对于每组数据,首先按样例所示的格式“Case #k:”输出该组数据的编号,然后输出一个整数,表示applepi最大能够获得的利润。

Sample Input

6
2 6 7 3 5 6
8
1 2 3 4 5 6 7 8

Sample Output

Case #1: 8
Case #2: 16


思路

  • 引用一段解释,关于加两次temp:

假设堆顶是第a天的报价,当前是第b的的报价,第a天买进的股票应该在第c天卖出,
第b天买进的股票需要在第d天卖出,
a<b<c<d,收益p[c]-p[a]+p[d]-p[b]
现在把第a天的股票在第b天抛出,p[b]-p[a],然后又买进第b天的股票,那么在第c天的时候,
堆顶为第b天的股票,抛出第b天的股票 p[c]-p[b],收益总和p[b]-p[a]+p[c]-p[b]=p[c]-p[a]
但因为第b天的股票应该在第d天抛出,所以要第二次再次买进第b天的股票
一一一一 https://www.cnblogs.com/Yuzao/p/6886194.html


代码

#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
int n,ntime;
priority_queue<int,vector<int>, greater<int> > q;
int main()
{
	while(~scanf("%d",&n))
	{
		long long temp,keep,ans=0; ++ntime;
		while(!q.empty()) q.pop();
		for(int i=1;i<=n;i++)
		{
			scanf("%lld",&temp); q.push(temp);
			if(temp>q.top()) ans+=temp-q.top(),q.pop(),q.push(temp);
		}
		printf("Case #%d: %lld
",ntime,ans);
	}
	return 0;
}
原文地址:https://www.cnblogs.com/wuwendongxi/p/13340822.html