題目說明#
小明最近想要用程式做股票交易,給一個股票的歷史價格 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];
}
}
