#include<iostream>
#include<stdlib.h>
#include<string>
#include<vector>
#include<algorithm>
#include<stdio.h>
using namespace std;
#define MAX 5002
typedef long long ll;//因为题中要求总股数不超过10的8次方
typedef vector<double> vec_pric;
typedef struct busn {
string kind;//类别,sell,buy,cancel
double price;//价格
int num;//交易数额
bool cancelOrNot;//是否取消
}Business;
Business B[MAX];
int main() {
/* 输入数据 */
int m = 0;
vec_pric vc;
while (cin >> B[m].kind) {
if (B[m].kind == "cancel") {
int index;
cin >> index;
B[index-1].cancelOrNot = true;
}
else {
cin >> B[m].price >> B[m].num;
B[m].cancelOrNot = false;
}
m++;
}
//处理
//将所有的价格放到一个vector中
for (int i = 0; i < m; ++i) {
if (!B[i].cancelOrNot) {
vc.push_back(B[i].price);
}
}
//排序
sort(vc.begin(), vc.end(), [](double a, double b)->bool {return a > b; });
//计算
double p0=0.0;
ll final_sum=0;
for (vec_pric::iterator it = begin(vc); it != end(vc); ++it) {
ll _sums = 0, s_sum = 0, b_sum = 0;
for (int i = 0; i < m; ++i) {
if (B[i].kind == "buy" && B[i].price >= *it && !B[i].cancelOrNot) {//对买单处理
b_sum += B[i].num;
}
if (B[i].kind == "sell" && B[i].price <= *it && !B[i].cancelOrNot) {
s_sum += B[i].num;
}
}
_sums = min(b_sum, s_sum);
if (final_sum < _sums) {
final_sum = _sums;
p0 = *it;
}
}
printf("%.2f %lld", p0, final_sum);
return 0;
}
#endif
这个题第一次提交只得了90分,并且还超时了。
后面想了一下可能在遍历vector数组时,一直使用it比较费时间,所以在遍历时使用了一个变量保存it,减少访问时间,最终提交100分。
修改后代码片段:
for (vec_pric::iterator it = begin(vc); it != end(vc); ++it) {
ll _sums = 0, s_sum = 0, b_sum = 0;
double p=*it;
for (int i = 0; i < m; ++i) {
if (B[i].kind == "buy" && B[i].price >= p && !B[i].cancelOrNot) {//对买单处理
b_sum += B[i].num;
}
if (B[i].kind == "sell" && B[i].price <= p && !B[i].cancelOrNot) {
s_sum += B[i].num;
}
}
_sums = min(b_sum, s_sum);
if (final_sum < _sums) {
final_sum = _sums;
p0 = *it;
}
}