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 }

 

posted @ 2017-10-25 18:45  ywsswy  阅读(270)  评论(0编辑  收藏  举报