10.09T2 贪心
Description
applepi训练了一个可以自动在股票市场进行量化交易的模型。通常来说,applepi写出的模型,你懂得,就好比一架印钞机。不过为了谨慎起见,applepi还是想先检查一下模型的效果。
applpie收集了“塞帕思股份(surpass)”在最近的连续N天内的价格。在每一天中,他可以做如下事情之一:
1.睡(把)觉(妹)。
2.以当天的价格作为成交价买入1股“塞帕思”的股票。
3.以当天的价格作为成交价卖出1股“塞帕思”的股票。
最初applepi不持有该股票。现在你需要计算出在最优策略下,N天后applepi能够获得的最大利润。为了维护森林的和平,本着清仓甩锅的原则,在N天的交易结束后applepi也不能持有“塞帕思”的股票。
applpie收集了“塞帕思股份(surpass)”在最近的连续N天内的价格。在每一天中,他可以做如下事情之一:
1.睡(把)觉(妹)。
2.以当天的价格作为成交价买入1股“塞帕思”的股票。
3.以当天的价格作为成交价卖出1股“塞帕思”的股票。
最初applepi不持有该股票。现在你需要计算出在最优策略下,N天后applepi能够获得的最大利润。为了维护森林的和平,本着清仓甩锅的原则,在N天的交易结束后applepi也不能持有“塞帕思”的股票。
Input
每个测试点包含若干组数据,以EOF结尾。对于每组数据:
第一行1个整数N。
第二行N个正整数,相邻两个整数之间用1个空格隔开,表示每一天股票的价格。
第一行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
Hint
样例2输入:
10
15831 47573 60015 51368 32460 34125 43074 75172 54014 93578
样例2输出:
Case #1: 161084
【数据规模与约定】
对于50%的数据,1≤N≤1000。
对于100%的数据,1≤N≤100000,股票价格不超过100000,每个测试点至多包含5组数据。
10
15831 47573 60015 51368 32460 34125 43074 75172 54014 93578
样例2输出:
Case #1: 161084
【数据规模与约定】
对于50%的数据,1≤N≤1000。
对于100%的数据,1≤N≤100000,股票价格不超过100000,每个测试点至多包含5组数据。
这是一道非常裸的贪心题,因为先买后卖,符合时间顺序,所以我们就按着顺序扔进小根堆就行了。
下面详细介绍下操作:
每来一个数,扔进堆。
若当前数大于堆顶,堆顶出,当前数进,ans+=两数之差。其实我们想一想,如果堆顶元素就是在这次卖出的,那么毫无问题,若是在后面卖出的,则后面的那个数一定大于当前数,所以在后面堆处理中,自然当前数会被后面的某个数优化掉,相当于当前数没有进过堆了,下面给出程序。
注意类似这种没有结束条件的读入一定要用cin读入,scanf容易出锅
code:
1 #include<iostream> 2 #include<cstdio> 3 #include<queue> 4 using namespace std; 5 int read() { 6 int x=0,f=1; 7 char c=getchar(); 8 while(!isdigit(c)) { 9 if(c=='-')f=-1; 10 c=getchar(); 11 } 12 while(isdigit(c)) { 13 x=(x<<3)+(x<<1)+c-'0'; 14 c=getchar(); 15 } 16 return x*f; 17 } 18 int a[100006]; 19 priority_queue<int>q; 20 int num=0; 21 int n; 22 int main() { 23 while(cin>>n) { 24 num++; 25 long long ans=0; 26 for(int i=1; i<=n; i++)a[i]=read(); 27 while(!q.empty())q.pop(); 28 for(int i=1; i<=n; i++) { 29 q.push(-a[i]); 30 if(a[i]>-q.top()) { 31 ans+=a[i]+q.top(); 32 q.pop(); 33 q.push(-a[i]); 34 } 35 } 36 cout<<"Case #"<<num<<": "<<ans<<endl; 37 } 38 return 0; 39 }
over