1. 程式人生 > 實用技巧 >【NOIP2016模擬3】量化交易

【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


思路

  • 貪心,DP轉移方程:f[i][j]=max{f[i-1][j-1]+}
  • 引用一段解釋,關於加兩次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\n",ntime,ans);
	}
	return 0;
}