1. 程式人生 > >SJTUOJ 1009. 二哥炒股票

SJTUOJ 1009. 二哥炒股票

題目內容

題目描述
二哥需要一個能根據交易記錄和股票價格記錄統計出先進收益的程式。

現金收益包括兩部分,一部分是賣出收入,一部分是每次交易需要支出的費用。賣出收入就是賣出股票獲得的總收入減去買入的總支出。股票的價格是按每股的價格給出的,而交易的最小單位是“一手”,每手是100股。每次買入的費用如下所述:

1.佣金,收取交易額的0.2%,但最低的收取標準是5元。比如買入總金額為1000元的股票,實際佣金是2元,但不超過5元,所以按5元收取。

2.過戶費,每一千股收取1元。

3.通訊費,由於二哥在上海,每次只收取本地交易費用1元。

每次賣出的費用標準與買入一致,但還要加收證券印花稅(交易額的0.1%)。

另外,二哥是個專一的人,他只對一支股票感興趣。

輸入格式
輸入分為兩部分,第一部分是二哥的交易記錄,第二部分是股票價格記錄。

交易記錄的第一行是一個正整數m,表示共有m個交易動作。每個交易動作佔一行,包括三個正整數t, a和d, d = 1時,表示在時間t買入該股票a手,當d = 2時,表示在時間t賣出該股票a手。記錄資訊保證有意義;d不會取其他值。

股票價格記錄的第一行是一個正整數n,表示共有n次價格變動。每次價格變動佔一行,包括兩個正整數t和v,表示在時間t該股票的價格變為v元每股。價格變動過程是按時間順序給出的,第一次價格變動之前不會發生交易;t使用的是一個虛擬的時間量度,在時間t進行的交易按價格v計算。

輸出格式
輸出二哥的現金收益,保留兩位小數(四捨五入)。

說明
對於所有資料:m≤50, v≤200, a≤200
對於70%的資料:n≤100 , t≤10000
對於30%的資料:n≤10000 , t≤100000000
Sample Input
2
15 50 1
40 30 2
4
10 100
20 90
30 95
40 102
Sample Output
-195928.00

程式碼實現及總結

#include <stdio.h>
#define M 50
double fees(int value, int account, int dealflag){
    double feevalue = value * account *
0.002; feevalue = feevalue < 5.0 ? 5.0 : feevalue;//佣金 feevalue += (account * 1.0 / 1000.0 + 1.0);//過戶費+通訊費 feevalue += (1 != dealflag) ? value * account * 0.001 : 0.0;//印花稅 return feevalue; } double deal(int value, int account, int dealflag){ double dealconf = 1 != dealflag ? 1.0 : -1.0; return dealconf * account * value - fees(value,account,dealflag); } int main() { int m,n,i,tin,vin,vlst; int t[M], a[M], d[M]; double money = 0; scanf("%d",&m); for(i = 0; i < m;i ++){ scanf("%d %d %d",&t[i], &a[i], &d[i]); } i = 0; scanf("%d",&n); while(n--){ scanf("%d %d",&tin,&vin); //操作在兩次變化之間的情況,注意可能有多筆 while(i < m && t[i] < tin){ money += deal(vlst,a[i] * 100.0,d[i]); i++; } if(t[i] >= tin){ vlst = vin; } } //最後一次變化之後集中操作的情況 while(i < m){ money += deal(vlst,a[i] * 100.0,d[i]); i++; } printf("%.2f\n",money); return 0; }

時間:12ms 空間:9192kb
所有細分專案正常考慮到即可,由於佣金一項有最低收費標準,所以如果想要合併計算優化的話需要將佣金單獨儲存。由於優化空間較小,可能放在甚閒之時會考慮嘗試。