问题描述
applepi 训练了一个可以自动在股票市场进行量化交易的模型。通常来说, applepi 写出的模型,你懂得,就好比一架印钞机。不过为了谨慎起见,applepi 还是想先检查一下模型的效果。
applpie 收集了“塞帕思股份(surpass)”在最近的连续 N 天内的价格。在每一 天中,他可以做如下事情之一:
- 睡(把)觉(妹)。
- 以当天的价格作为成交价买入 1 股“塞帕思”的股票。
- 以当天的价格作为成交价卖出 1 股“塞帕思”的股票。
最初 applepi 不持有该股票。现在你需要计算出在最优策略下, N 天后 applepi 能够获得的最大利润。为了维护森林的和平,本着清仓甩锅的原则,在 N 天的 交易结束后 applepi 也不能持有“塞帕思”的股票。
输入格式
每个测试点包含若干组数据,以 EOF 结尾。对于每组数据: 第一行 1 个整数 N。 第二行 N 个正整数,相邻两个整数之间用 1 个空格隔开,表示每一天股票 的价格。
输出格式
对于每组数据,首先按样例所示的格式“Case #k:”输出该组数据的编号, 然后输出一个整数,表示 applepi 最大能够获得的利润。
样例输入1
6
2 6 7 3 5 6
8
1 2 3 4 5 6 7 8
样例输出1
Case #1: 8
Case #2: 16
样例输入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 组数据。
题解
贪心
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n; 4 int gi(){ 5 int str=0; 6 char ch=getchar(); 7 while(ch>'9' || ch<'0'){ 8 ch=getchar(); 9 } 10 while(ch>='0' && ch<='9'){ 11 str=str*10+ch-'0'; 12 ch=getchar(); 13 } 14 return str; 15 } 16 int cnt=0; 17 int t[400000],num=0; 18 void putin(int x){ 19 t[++num]=x; 20 int now=num,next; 21 while(now>1){ 22 next=(now>>1); 23 if(t[now]>=t[next]){ 24 break; 25 } 26 swap(t[now],t[next]); 27 now=next; 28 } 29 return ; 30 } 31 int getit(){ 32 int str=t[1]; 33 t[1]=t[num--]; 34 int now=1,next; 35 while((now<<1)<=num){ 36 next=now<<1; 37 if(t[next]>t[next+1] && next<num){ 38 next++; 39 } 40 if(t[now]<=t[next]){ 41 break; 42 } 43 swap(t[now],t[next]); 44 now=next; 45 } 46 return str; 47 } 48 void work(){ 49 cnt++; 50 int x,tmp; 51 long long ans=0; 52 for(int i=1;i<=n;i++){ 53 x=gi(); 54 if(!num || t[1]>=x){ 55 putin(x); 56 }else{ 57 tmp=getit(); 58 ans+=x-tmp; 59 putin(x); 60 putin(x); 61 } 62 } 63 cout<<"Case #"<<cnt<<": "<<ans<<endl; 64 return ; 65 } 66 int main(){ 67 while(cin>>n){ 68 work(); 69 num=0; 70 } 71 return 0; 72 }