股票买卖(信息学奥赛一本通-T1302)
生活随笔
收集整理的這篇文章主要介紹了
股票买卖(信息学奥赛一本通-T1302)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【題目描述】
最近越來越多的人都投身股市,阿福也有點心動了。謹記著“股市有風險,入市需謹慎”,阿福決定先來研究一下簡化版的股票買賣問題。
假設阿福已經準確預測出了某只股票在未來N天的價格,他希望買賣兩次,使得獲得的利潤最高。為了計算簡單起見,利潤的計算方式為賣出的價格減去買入的價格。
同一天可以進行多次買賣。但是在第一次買入之后,必須要先賣出,然后才可以第二次買入。
現在,阿福想知道他最多可以獲得多少利潤。
【輸入】
輸入的第一行是一個整數T(T≤50),表示一共有T組數據。
接下來的每組數據,第一行是一個整數N(1≤N≤100,000),表示一共有N天。第二行是 N 個被空格分開的整數,表示每天該股票的價格。該股票每天的價格的絕對值均不會超過1,000,000。
【輸出】
對于每組數據,輸出一行。該行包含一個整數,表示阿福能夠獲得的最大的利潤。
【輸入樣例】
3
7
5 14 -2 4 9 3 17
6
6 8 7 4 1 -2
4
18 9 5 2
【輸出樣例】
28
2
0
【源程序】
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<string> #include<cstdlib> #include<queue> #include<vector> #define INF 0x3f3f3f3f #define PI acos(-1.0) #define N 100001 #define MOD 100001 #define E 1e-12 using namespace std; int a[N],f1[N],f2[N]; int main() {int t,ans;scanf("%d",&t);while(t--){int n;scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]);int minn=INF,maxx=-INF;f1[0]=0;f2[n+1]=0;for(int i=1;i<=n;i++){minn=min(minn,a[i]);f1[i]=max(f1[i-1],a[i]-minn);}for(int i=n;i>=1;i--){maxx=max(maxx,a[i]);f2[i]=max(f2[n+1],maxx-a[i]);}int ans=-INF;for(int i=1;i<=n;i++)ans=max(ans,f1[i]+f2[i]);printf("%d\n",ans);}return 0; }?
總結
以上是生活随笔為你收集整理的股票买卖(信息学奥赛一本通-T1302)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 连通块(信息学奥赛一本通-T1335)
- 下一篇: Cow Picnic(POJ-3256)