程式交易

題目說明

小明最近想要用程式做股票交易,給一個股票的歷史價格 a[1] , a[2] ,...... a[n] 他的投資策略如下

  1. 同一個時間最多只會持有一張股票, 並會在時間點 1 花 a[1] 買進。
  2. 若當下持有股票且該股票買進價格為 x,當遇到價格 y 大於等於 x+D 時即賣出,並轉得利潤 y-x。
  3. 若當下沒有持有股票且上一次的賣出價格為 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];
    }
}