1009. 二哥炒股票
题目描述
二哥需要一个能根据交易记录和股票价格记录统计出先进收益的程序。
现金收益包括两部分,一部分是卖出收入,一部分是每次交易需要支出的费用。卖出收入就是卖出股票获得的总收入减去买入的总支出。股票的价格是按每股的价格给出的,而交易的最小单位是“一手”,每手是100股。每次买入的费用如下所述:
佣金,收取交易额的0.2%,但最低的收取标准是5元。比如买入总金额为1000元的股票,实际佣金是2元,但不超过5元,所以按5元收取。
过户费,每一千股收取1元。
通讯费,由于二哥在上海,每次只收取本地交易费用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
分析
题目本来很简单,但是其中要特别注意int除法运算会削去小数点。
#include <iomanip>
#include <iostream>
using namespace std;
int main()
{
int m;
int in[50][3];
double sum=0.0;
int i;
int n;
int t=0, v=0;
int tmp_t, tmp_v;
int record=0;
cin>>m;
for(i=0; i<m; i++)
cin>>in[i][0]>>in[i][1]>>in[i][2];
cin>>n;
for(i=0; i<n; i++) {
cin>>tmp_t>>tmp_v;
for(record=0; record<m; record++) {
if(in[record][0]>=t && in[record][0]<tmp_t) {
double tmp = in[record][1]*100*v*0.002;
if(in[record][2]==1) {
sum = sum - (tmp > 5 ? tmp : 5);
sum = sum - in[record][1]*100.0/1000;
sum = sum - 1;
sum = sum - in[record][1]*100*v;
}
else if(in[record][2]==2) {
sum = sum - (tmp > 5 ? tmp : 5);
sum = sum - in[record][1]*100.0/1000;
sum = sum - 1;
sum = sum - in[record][1]*100*v*0.001;
sum = sum + in[record][1]*100*v;
}
}
}
t=tmp_t, v=tmp_v;
}
for(record=0; record<m; record++) { //注意最后的时间
if(in[record][0]>=t) {
double tmp = in[record][1]*100*v*0.002;
if(in[record][2]==1) {
sum = sum - (tmp > 5 ? tmp : 5);
sum = sum - in[record][1]*100.0/1000;
sum = sum - 1;
sum = sum - in[record][1]*100*v;
}
else if(in[record][2]==2) {
sum = sum - (tmp > 5 ? tmp : 5);
sum = sum - in[record][1]*100.0/1000;
sum = sum - 1;
sum = sum - in[record][1]*100*v*0.001;
sum = sum + in[record][1]*100*v;
}
}
}
cout.setf(ios::fixed);
cout<<setprecision(2)<<sum;
return 0;
}