CCF 201412-3 集合竞价
试题编号: | 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。
|
关键词:顺序执行,string转double long long,stringstream连续转换,格式输出设置0补齐cout.setf(ios::fixed),设置精度2位小数setprecision(2)
1 #include<iostream> 2 #include<string> 3 #include<vector> 4 #include<sstream> 5 #include<map> 6 using namespace std; 7 struct yclass{ 8 string cmd; 9 int flag;//0:unuseful 1:useful 10 }; 11 int main(){ 12 //freopen("in2.txt","r",stdin); 13 string bufs; 14 vector<yclass> v; 15 while(getline(cin,bufs)){ 16 yclass buf; 17 buf.cmd = bufs; 18 buf.flag = 1; 19 v.push_back(buf); 20 } 21 for(int i = 0;i<v.size();i++){ 22 bufs = v[i].cmd; 23 int bufl = bufs.find_first_of(" "); 24 bufs = v[i].cmd.substr(0,bufl); 25 if(bufs == "cancel"){ 26 bufs = v[i].cmd.substr(bufl+1); 27 stringstream ss; 28 ss<<bufs; 29 ss>>bufl; 30 v[bufl-1].flag = 0; 31 v[i].flag = 0; 32 } 33 } 34 map<double,long long> buy; 35 map<double,long long> sell; 36 for(int i = 0;i<v.size();i++){ 37 bufs = v[i].cmd; 38 int bufl = bufs.find_first_of(" "); 39 bufs = v[i].cmd.substr(0,bufl); 40 if(v[i].flag == 1){ 41 string bufs1; 42 string bufs2; 43 stringstream ss; 44 double bufd; 45 long long bufll; 46 if(bufs == "buy"){ 47 bufs = v[i].cmd.substr(bufl+1); 48 bufl = bufs.find_first_of(" "); 49 bufs1 = bufs.substr(0,bufl); 50 bufs2 = bufs.substr(bufl+1); 51 ss<<bufs1; 52 ss>>bufd; 53 ss.clear(); 54 bufd = -bufd; 55 ss<<bufs2; 56 ss>>bufll; 57 if(buy.find(bufd) != buy.end()){ 58 buy[bufd] += bufll; 59 } 60 else{ 61 buy[bufd] = bufll; 62 } 63 } 64 else if(bufs == "sell"){ 65 bufs = v[i].cmd.substr(bufl+1); 66 bufl = bufs.find_first_of(" "); 67 bufs1 = bufs.substr(0,bufl); 68 bufs2 = bufs.substr(bufl+1); 69 ss<<bufs1; 70 ss>>bufd; 71 ss.clear(); 72 ss<<bufs2; 73 ss>>bufll; 74 if(sell.find(bufd) != sell.end()){ 75 sell[bufd] += bufll; 76 } 77 else{ 78 sell[bufd] = bufll; 79 } 80 } 81 } 82 } 83 double resd = 0; 84 long long resl = 0; 85 long long bl; 86 long long sl; 87 double bd; 88 double sd; 89 map<double,long long>::iterator itb = buy.begin(); 90 map<double,long long>::iterator its = sell.begin(); 91 bd = -itb->first; 92 bl = itb->second; 93 sd = its->first; 94 sl = its->second; 95 while(true){ 96 if(bd < sd){ 97 break; 98 } 99 else{ 100 resd = bd; 101 if(sl >= bl){ 102 resl += bl; 103 sl -= bl; 104 bl = 0; 105 } 106 else{ 107 resl += sl; 108 bl -= sl; 109 sl = 0; 110 } 111 } 112 if(sl == 0){ 113 its++; 114 if(its == sell.end()){ 115 break; 116 } 117 else{ 118 sd = its->first; 119 sl = its->second; 120 } 121 } 122 if(bl == 0){ 123 itb++; 124 if(itb == buy.end()){ 125 break; 126 } 127 else{ 128 bd = -itb->first; 129 bl = itb->second; 130 } 131 } 132 } 133 cout.setf(ios::fixed); 134 cout.precision(2); 135 cout << resd << " " << resl; 136 return 0; 137 }