试题编号: | 201412-3 |
试题名称: | 集合竞价 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 某股票交易所请你编写一个程序,根据开盘前客户提交的订单来确定某特定股票的开盘价和开盘成交量。 输入格式 输入数据有任意多行,每一行是一条记录。保证输入合法。股数为不超过108的正整数,出价为精确到恰好小数点后两位的正实数,且不超过10000.00。 输出格式 你需要输出一行,包含两个数,以一个空格分隔。第一个数是开盘价,第二个是此开盘价下的成交量。开盘价需要精确到小数点后恰好两位。 样例输入 buy 9.25 100 样例输出 9.00 450 评测用例规模与约定 对于100%的数据,输入的行数不超过5000。 |
问题链接:CCF201412-3 集合竞价
问题分析:简单模拟即可,不使用优先队列也可以AC
程序说明:(略)
提交后得100分的C++程序:
#include<iostream>
#include<string.h>
#include<algorithm>
#include<set>
using namespace std;
const int N=5000;
struct Deal{
int id;
double _price;
long long quantity;
}b[N],s[N];
bool flag[N+1];
set<double> price;
int main()
{
memset(flag,false,sizeof(flag));
int i=0,j=0,id=1;
string str;
while(cin>>str){
if(str=="buy"){
cin>>b[i]._price>>b[i].quantity;
b[i++].id=id++;
}
else if(str=="sell"){
cin>>s[j]._price>>s[j].quantity;
s[j++].id=id++;
}
else if(str=="cancel"){
int temp;
cin>>temp;
flag[temp]=true; //删除的订单号标记
id++;
}
else
break;
}
for(int k=0;k<i;k++){
if(flag[b[k].id]==false)
price.insert(b[k]._price);
}
for(int k=0;k<j;k++){
if(flag[s[k].id]==false)
price.insert(s[k]._price);
}
long long quantity_b,quantity_s,quantity=0;
double val=0;
for(set<double>::iterator iter=price.begin();iter!=price.end();iter++){
quantity_b=0;
quantity_s=0;
for(int t=0;t<i;t++)
if(b[t]._price>=*iter&&(!flag[b[t].id]))
quantity_b+=b[t].quantity;
for(int t=0;t<j;t++)
if(s[t]._price<=*iter&&(!flag[s[t].id]))
quantity_s+=s[t].quantity;
long long temp=min(quantity_b,quantity_s);
if(quantity<=temp){
quantity=temp;
val=*iter;
}
}
printf("%.2lf %lld",val,quantity);
return 0;
}