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 集合竞价的主要内容,如果未能解决你的问题,请参考以下文章

CCF201412-3 集合竞价(100分)

CCF 201412-3 集合竞价 100分

CCF 201412-3 集合竞价 100分

CCF 集合竞价

求集合竞价规则选股方法的策略源码

集合竞价简析!