试题编号: | 201412-3 |
---|---|
试题名称: | 集合竞价 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述: 某股票交易所请你编写一个程序,根据开盘前客户提交的订单来确定某特定股票的开盘价和开盘成交量。 该程序的输入由很多行构成,每一行为一条记录,记录可能有以下几种: 1. buy p s 表示一个购买股票的买单,每手出价为p,购买股数为s。 2. sell p s 表示一个出售股票的卖单,每手出价为p,出售股数为s。 3. cancel i表示撤销第i行的记录。 如果开盘价为p0,则系统可以将所有出价至少为p0的买单和所有出价至多为p0的卖单进行匹配。因此,此时的开盘成交量为出价至少为p0的买单的总股数和所有出价至多为p0的卖单的总股数之间的较小值。 输入格式 输入数据有任意多行,每一行是一条记录。保证输入合法。股数为不超过108的正整数,出价为精确到恰好小数点后两位的正实数,且不超过10000.00。 输出格式 你需要输出一行,包含两个数,以一个空格分隔。第一个数是开盘价,第二个是此开盘价下的成交量。开盘价需要精确到小数点后恰好两位。 样例输入 buy 9.25 100 buy 8.88 175 sell 9.00 1000 buy 9.00 400 sell 8.92 400 cancel 1 buy 100.00 50 样例输出 9.00 450 评测用例规模与约定 对于100%的数据,输入的行数不超过5000。 |
c++代码如下:
//集合竞价
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
//9525 12568
struct stock {
string order_name;//买入还是卖出
float price;//出价
long long number;//股数
bool enable;//true-还在 false-撤销
stock(string a,float b,long long c, bool e):order_name(a), price(b),number(c),enable(e){}
};
int main(){
vector<stock> v;
set<float> ss;
//输入部分
while(1){
string s;
cin>>s;
if(s == "buy" || s == "sell"){
float p;
int n;
cin >> p >>n;
stock *t = new stock(s,p,n,true);
v.push_back(*t);
}else if(s == "cancel"){
int line;
cin >> line;
stock *t = new stock(s,line,0,false);
v.push_back(*t);
v[line-1].enable=false;
}else{
break;
}
}
//设置开盘价的选择范围(一定是买家的价格之一)
for(int i=0; i<v.size(); i++){
if(v[i].enable == true && v[i].order_name == "buy"){
ss.insert(v[i].price);
}
}
float opening=0;
float opening_price=0;//开盘价
long long max_trading_volume=0;//成交量
//选择合适的开价
set<float>::iterator it;
for(it=ss.begin(); it!=ss.end(); it++){
opening = *it;
long long buy_num=0;
long long sell_num=0;
for(int j=0; j<v.size(); j++){
if(v[j].enable == true && v[j].order_name == "buy" && v[j].price >= opening){
buy_num += v[j].number;
}else if(v[j].enable == true && v[j].order_name == "sell" && v[j].price <= opening){
sell_num += v[j].number;
}
}
long long min = buy_num < sell_num ? buy_num : sell_num;
if(min >= max_trading_volume){
max_trading_volume = min;
opening_price = opening;
}
}
printf("%0.2f ",opening_price);
cout << max_trading_volume <<endl;
return 0;
}