题目描述
二哥需要一个能根据交易记录和股票价格记录统计出先进收益的程序。
现金收益包括两部分,一部分是卖出收入,一部分是每次交易需要支出的费用。卖出收入就是卖出股票获得的总收入减去买入的总支出。股票的价格是按每股的价格给出的,而交易的最小单位是“一手”,每手是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≤50m≤50, v≤200v≤200, a≤200a≤200
对于70%的数据:n≤100n≤100 , t≤10000t≤10000
对于30%的数据:n≤10000n≤10000 , t≤100000000t≤100000000
Sample Input
2
15 50 1
40 30 2
4
10 100
20 90
30 95
40 102
Sample Output
-195928.00
代码:
#include <iostream>
#include <iomanip>
using namespace std;
int main(int argc, char const *argv[]) {
// 交易记录
int dealNum;
cin >> dealNum;
int t1[dealNum];
int deal[dealNum][2];
for(int i = 0; i < dealNum; i++) {
cin >> t1[i] >> deal[i][0] >> deal[i][1];
}
// 股票价格记录
int priceNum;
cin >> priceNum;
int t2[priceNum];
int price[priceNum];
for(int i = 0; i < priceNum; i++) {
cin >> t2[i] >> price[i];
}
double income = 0;
// 计算每次买入费用
int k = 0;
for(int i = 0; i < dealNum; i++) {
// 找到每次交易时的股价下标k
int j = k;
for( ; j < priceNum; ) {
if(t1[i] < t2[j]) {
k = j - 1;
break;
}
else j++;
}
if(j == priceNum) k = j - 1;
if(k == -1) {
k = 0;
continue; // 第一次价格变动之前不会发生交易
}
if(deal[i][1] == 1) { // 买股票
double p1, p2, p3, p4; // 买股票支出、佣金、过户费、通讯费
p1 = deal[i][0] * 100 * price[k];
double temp = p1 * 0.002; // 佣金不足5元按5元算
p2 = temp > 5 ? temp : 5;
temp = deal[i][0] * 0.1; // 直接用千股乘0.1,不用考虑不足千股
// temp = deal[i][0] / 10;
// if(deal[i][0] % 10 != 0) temp++; // 【错误】多少千股,不足一千股按一千股算
p3 = temp;
p4 = 1;
income = income - p1 - p2 - p3 - p4;
}
else{ // 卖股票
double p1, p2, p3, p4, p5; // 卖股票收入、佣金、过户费、通讯费、印花税
p1 = deal[i][0] * 100 * price[k];
double temp = p1 * 0.002; // 佣金不足5元按5元算
p2 = temp > 5 ? temp : 5;
temp = deal[i][0] * 0.1;
// temp = deal[i][0] / 10;
// if(deal[i][0] % 10 != 0) temp++; // 【错误】多少千股,不足一千股按一千股算
p3 = temp;
p4 = 1;
p5 = p1 * 0.001;
income = income + p1 - p2 - p3 - p4 - p5;
}
}
// 保留两位小数输出(四舍五入),需要头文件#include <iomanip>
cout << setiosflags(ios::fixed) << setprecision(2) << income << endl;
return 0;
}
注:
题目说过户费每一千股收取1元,我理解为不足一千股也算一千股,结果不能ac。找了很久的错发现是这个问题,直接用多少手股数乘0.1就行了,蓝瘦,我感觉题目有点表意不明了。