開啟章節選單
程式交易
題目說明
小明最近想要用程式做股票交易,給一個股票的歷史價格 a[1] , a[2] ,...... a[n] 他的投資策略如下
- 同一個時間最多只會持有一張股票, 並會在時間點 1 花 a[1] 買進。
- 若當下持有股票且該股票買進價格為 x,當遇到價格 y 大於等於 x+D 時即賣出,並轉得利潤 y-x。
- 若當下沒有持有股票且上一次的賣出價格為 x ,當遇到價格 y 小於等於 x-D 時則會買進股票。
輸出依照上述規則買賣後所得到的利潤和,若交易結束仍持有股票,則不考慮該股票買進的成本,直接無視該股票即可。
解題過程
先宣告 n d have x sum這些變數,並且輸入 n d ,並用 n 的值宣告一個陣列 a 來儲存股票價格,並將股票價格輸入
int n,d,have=1,x=0,sum=0; // have 0沒有股票 1有股票 cin >> n >> d; int a[n]; for(int i=0;i<n;i++){ cin >> a[i]; }
接著將第一次買進股票的價格設為 a[0]
x = a[0];
接著再使用a陣列模擬股票交易的過程,要使用到if指令將有股票和沒股票的情況分開,在有股票的情況中,遇到價格 y 大於等於 x+D 時即賣出,並轉得利潤 y-x,如果沒有股票,遇到價格 y 小於等於 x-D 時則會買進股票,故程式碼可以這樣寫
for(int i=0;i<n;i++){ if(have == 1){ // 有股票 if((x+d) <= a[i]){ // 達到賣出股票資格 have = 0; // 賣出股票代表手邊沒有股票了 sum += a[i]; // 將目前總資產加上交易價格 x = a[i]; // 將x設為這次交易的價格 } }else if(have == 0){ // 沒股票 if(a[i] <= (x-d)){ have = 1; // 買進股票 sum -= a[i]; // 總資產減掉交易價格 x = a[i]; } } }
最後,要判斷手邊是否有股票,如果有,那麼要將股票當作沒買進
if(have == 0){ // 如果手邊沒股票 cout << sum-a[0]; // 總資產扣除一開始的股票價格就是總利潤 }else{ //如果手邊有股票 cout << sum+x-a[0]; // 總資產要先加回最後購買股票的價格再扣除一開始的股票價格 }
完整程式碼如下
#include <iostream> using namespace std; int main(){ int n,d,have=0,x=0,sum=0; // have 0沒有 1有 cin >> n >> d; int a[n]; for(int i=0;i<n;i++){ cin >> a[i]; } x = a[0]; have = 1; for(int i=0;i<n;i++){ if(have == 1){ // 有股票 if((x+d) <= a[i]){ have = 0; sum += a[i]; x = a[i]; } }else if(have == 0){ // 沒股票 if(a[i] <= (x-d)){ have = 1; sum -= a[i]; x = a[i]; } } } if(have == 0){ cout << sum-a[0]; }else{ cout << sum+x-a[0]; } }