暴力枚举(带注解)
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=5010;
struct Record{
int type;
double p;
int s;
bool is_del;
}d[N];
int n;
int main(){
string type;
while(cin>>type){
if(type == "buy"){
double p;int s;
cin>>p>>s;
d[++n]={1,p,s};
}
else if(type == "sell"){
double p;int s;
cin>>p>>s;
d[++n] = {2,p,s};
}
else{//删除记录
int id;
cin>>id;
d[id].is_del = true;
d[++n].is_del = true;
}
}
double res_p;//开盘价
ll res_s = 0;//成交量
for(int i = 1; i <= n; i++){
//价格范围一定是在现有的价格区间内
if (d[i].is_del == false){//没删的话
double p = d[i].p;//取 i 的价格
ll s1 = 0, s2 = 0;
//枚举就计算成交数
for(int j = 1; j <= n; j++){
if(d[j].is_del == false){//该记录存在
if (d[j].type == 1 && d[j].p >= p) s1 += d[j].s;//买入>=p的
else if (d[j].type == 2 && d[j].p <= p) s2 += d[j].s;//卖出<=p的
}
}
ll t = min(s1, s2);//成交量
//更新开盘价 res_p 和成交量 res_s----都尽可能大
//开盘成交量尽可能地大,如果有多个符合条件的开盘价,输出最高的一个。
if (t > res_s || (t == res_s && p > res_p))//先考虑成交量,再考虑开盘价
res_p = p, res_s = t;
}
}
printf("%.2lf %lld\n", res_p, res_s);
return 0;
}