10.09T2 贪心

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

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组数据。
 
 
 

这是一道非常裸的贪心题,因为先买后卖,符合时间顺序,所以我们就按着顺序扔进小根堆就行了。

下面详细介绍下操作:

每来一个数,扔进堆。

若当前数大于堆顶,堆顶出,当前数进,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

原文地址:https://www.cnblogs.com/saionjisekai/p/9760249.html