时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 某股票交易所请你编写一个程序,根据开盘前客户提交的订单来确定某特定股票的开盘价和开盘成交量。 输入格式 输入数据有任意多行,每一行是一条记录。保证输入合法。股数为不超过108的正整数,出价为精确到恰好小数点后两位的正实数,且不超过10000.00。 输出格式 你需要输出一行,包含两个数,以一个空格分隔。第一个数是开盘价,第二个是此开盘价下的成交量。开盘价需要精确到小数点后恰好两位。 样例输入 buy 9.25 100 样例输出 9.00 450 评测用例规模与约定 对于100%的数据,输入的行数不超过5000。 |
好魔性的一道题,浮点数比大小坑出天际。还有cancel命令,。。。,两个cancal作用在同一条指令,就是抵消了!!!
#include<bits/stdc++.h>
#define MAX 150005
#define MOD 1000000007
typedef long long LL;
//const int INF = 1e9+7;
#define VM 1000010
using namespace std;
#define inf 0.00000001
struct node{
int op;
double cost;
LL num;
int use;
}piao[5005],buy[5005],sell[5005];
bool cmp1(node a,node b){//由大到小
return (a.cost-b.cost)>inf;
}
bool cmp2(node a,node b){//由小到大
return (b.cost-a.cost)>inf;
}
int main(){
string name;
int id,no=0;
int i,j;
double c,n;
for(i=0;i<5005;i++)
piao[i].use=1;
buy[i].num=sell[i].num=0;
while(cin>>name){
if(name=="cancel"){
cin>>id;
piao[id-1].use=0;
piao[no].op=0;
no++;
}
else if(name=="sell"||name=="buy"){
cin>>c>>n;
piao[no].cost=c;
piao[no].num=n;
if(name=="buy"){
piao[no].op=1;
}
else piao[no].op=2;
no++;
}
else break;
}
//printf("%d\n",no);
int bid=0,sid=0;
sort(piao,piao+no,cmp1);
for(i=0;i<no;i++){
if(piao[i].use==1&&piao[i].op==1){//buy
// printf("%.2lf %lld\n",piao[i].cost,piao[i].num);
buy[bid].cost=piao[i].cost;
if(bid==0)buy[bid].num=piao[i].num;
else buy[bid].num=buy[bid-1].num+piao[i].num;
bid++;
}
}
//for(i=0;i<bid;i++)printf("%d\n",buy[i].num);
sort(piao,piao+no,cmp2);
for(i=0;i<no;i++){
if(piao[i].use==1&&piao[i].op==2){//sell
sell[sid].cost=piao[i].cost;
if(sid==0)sell[sid].num=piao[i].num;
else sell[sid].num=sell[sid-1].num+piao[i].num;
sid++;
}
}
//for(i=0;i<sid;i++)printf("%d\n",sell[i].num);
double anscost=0.0,tmpcost=0.0;
LL ansnum=0,tmpnum=0;
for(i=0;i<bid;i++){
for(j=0;j<sid;j++){
if((sell[j].cost-buy[i].cost)>inf)
break;//sell按cost由小到大排序, buy按cost由大到小排序,sell>buy时找到一个合适的竞价
else tmpnum=min(buy[i].num,sell[j].num);
}
if(tmpnum>ansnum){//确认最大的竞价
ansnum=tmpnum;
anscost=buy[i].cost;
}
}
cout<<setiosflags(ios::fixed)<<setprecision(2);
cout<<anscost<<" ";
cout<<setiosflags(ios::fixed)<<setprecision(0);
cout<<ansnum<<endl;
return 0;
}