问题描述
试题编号: | 201412-3 |
试题名称: | 集合竞价 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 某股票交易所请你编写一个程序,根据开盘前客户提交的订单来确定某特定股票的开盘价和开盘成交量。 输入格式 输入数据有任意多行,每一行是一条记录。保证输入合法。股数为不超过108的正整数,出价为精确到恰好小数点后两位的正实数,且不超过10000.00。 输出格式 你需要输出一行,包含两个数,以一个空格分隔。第一个数是开盘价,第二个是此开盘价下的成交量。开盘价需要精确到小数点后恰好两位。 样例输入 buy 9.25 100 样例输出 9.00 450 评测用例规模与约定 对于100%的数据,输入的行数不超过5000。 |
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
//要注意在统一价格有卖有买的情况
struct node
{
int flag;
double price;
long long sum;
node(int f,double p,long long s):flag(f),price(p),sum(s)
{
}
};
vector<node> q;
bool cmp(node n1,node n2)
{
return n1.price<n2.price;
}
int main(int argc, char** argv)
{
string s;
double d;
long long n;
while(cin>>s)
{
if(s=="buy")
{
cin>>d>>n;
q.push_back(node(0,d,n));
}
else if(s=="sell")
{
cin>>d>>n;
q.push_back(node(1,d,n));
}
else if(s=="cancel")
{
int w;
cin>>w;
q[w-1].flag=-1;
q.push_back(node(-1,0,0));
}
}
sort(q.begin(),q.end(),cmp);
long long MS=0;
double fi=0.0;
for(int i=0;i<q.size();i++)
{
if(q[i].flag==-1)
continue;
long long ans1=0;
long long ans2=0;
double cankao=q[i].price;
for(int j=0;j<q.size();j++)
{
if(q[j].flag==1&&q[j].price<=cankao)
{
ans1+=q[j].sum;
}
if(q[j].price>cankao)
{
break;
}
}
for(int k=q.size()-1;k>=0;k--)
{
if(q[k].flag==0&&q[k].price>=cankao)
{
ans2+=q[k].sum;
}
else if(q[k].price<cankao)
{
break;
}
}
if(MS<=min(ans1,ans2))
{
MS=min(ans1,ans2);
fi=q[i].price;
}
}
printf("%.2lf %lld",fi,MS);
return 0;
}