CCF 201412-3 集合竞价
Posted ywsswy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 #include<iomanip> 7 using namespace std; 8 struct yclass{ 9 string cmd; 10 int flag;//0:unuseful 1:useful 11 }; 12 int main(){ 13 //freopen("in2.txt","r",stdin); 14 string bufs; 15 vector<yclass> v; 16 while(getline(cin,bufs)){ 17 yclass buf; 18 buf.cmd = bufs; 19 buf.flag = 1; 20 v.push_back(buf); 21 } 22 for(int i = 0;i<v.size();i++){ 23 bufs = v[i].cmd; 24 int bufl = bufs.find_first_of(" "); 25 bufs = v[i].cmd.substr(0,bufl); 26 if(bufs == "cancel"){ 27 bufs = v[i].cmd.substr(bufl+1); 28 stringstream ss; 29 ss<<bufs; 30 ss>>bufl; 31 v[bufl-1].flag = 0; 32 v[i].flag = 0; 33 } 34 } 35 map<double,long long> buy; 36 map<double,long long> sell; 37 for(int i = 0;i<v.size();i++){ 38 bufs = v[i].cmd; 39 int bufl = bufs.find_first_of(" "); 40 bufs = v[i].cmd.substr(0,bufl); 41 if(v[i].flag == 1){ 42 string bufs1; 43 string bufs2; 44 stringstream ss; 45 double bufd; 46 long long bufll; 47 if(bufs == "buy"){ 48 bufs = v[i].cmd.substr(bufl+1); 49 bufl = bufs.find_first_of(" "); 50 bufs1 = bufs.substr(0,bufl); 51 bufs2 = bufs.substr(bufl+1); 52 ss<<bufs1; 53 ss>>bufd; 54 ss.clear(); 55 bufd = -bufd; 56 ss<<bufs2; 57 ss>>bufll; 58 if(buy.find(bufd) != buy.end()){ 59 buy[bufd] += bufll; 60 } 61 else{ 62 buy[bufd] = bufll; 63 } 64 } 65 else if(bufs == "sell"){ 66 bufs = v[i].cmd.substr(bufl+1); 67 bufl = bufs.find_first_of(" "); 68 bufs1 = bufs.substr(0,bufl); 69 bufs2 = bufs.substr(bufl+1); 70 ss<<bufs1; 71 ss>>bufd; 72 ss.clear(); 73 ss<<bufs2; 74 ss>>bufll; 75 if(sell.find(bufd) != sell.end()){ 76 sell[bufd] += bufll; 77 } 78 else{ 79 sell[bufd] = bufll; 80 } 81 } 82 } 83 } 84 double resd = 0; 85 long long resl = 0; 86 long long bl; 87 long long sl; 88 double bd; 89 double sd; 90 map<double,long long>::iterator itb = buy.begin(); 91 map<double,long long>::iterator its = sell.begin(); 92 bd = -itb->first; 93 bl = itb->second; 94 sd = its->first; 95 sl = its->second; 96 while(true){ 97 if(bd < sd){ 98 break; 99 } 100 else{ 101 resd = bd; 102 if(sl >= bl){ 103 resl += bl; 104 sl -= bl; 105 bl = 0; 106 } 107 else{ 108 resl += sl; 109 bl -= sl; 110 sl = 0; 111 } 112 } 113 if(sl == 0){ 114 its++; 115 if(its == sell.end()){ 116 break; 117 } 118 else{ 119 sd = its->first; 120 sl = its->second; 121 } 122 } 123 if(bl == 0){ 124 itb++; 125 if(itb == buy.end()){ 126 break; 127 } 128 else{ 129 bd = -itb->first; 130 bl = itb->second; 131 } 132 } 133 } 134 cout.setf(ios::fixed); 135 cout << setprecision(2) << resd << " " << resl; 136 return 0; 137 }
以上是关于CCF 201412-3 集合竞价的主要内容,如果未能解决你的问题,请参考以下文章