本文主要是介绍CSP2014_12_3集合竞价,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
201412-3 | |
试题名称: | 集合竞价 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 某股票交易所请你编写一个程序,根据开盘前客户提交的订单来确定某特定股票的开盘价和开盘成交量。 输入格式 输入数据有任意多行,每一行是一条记录。保证输入合法。股数为不超过108的正整数,出价为精确到恰好小数点后两位的正实数,且不超过10000.00。 输出格式 你需要输出一行,包含两个数,以一个空格分隔。第一个数是开盘价,第二个是此开盘价下的成交量。开盘价需要精确到小数点后恰好两位。 样例输入 buy 9.25 100 样例输出 9.00 450 评测用例规模与约定 对于100%的数据,输入的行数不超过5000。 |
#include<cstdio>
#include<iostream>
#include<vector>
#include<string>
#include<map>
#include<set>
#include<cstring>
#include<cmath>
#define pb push_back
#define rep(i,j,k) for(int i=j;i<k;++i)
#define mst(a,b) memset((a),(b),sizeof(a))
using namespace std;
typedef long long LL;
typedef vector<int,int> pii;
struct Stock{int type;double price;int num;Stock(){}Stock(int pt,double pp, int nn):type(pt),price(pp),num(nn){}
}stk[5005];int main(){// freopen("input.txt","r",stdin);set<double,greater<double> > p; //存储可能的开盘价格 char s[10];double price;int num,pos[5005]; //pos记录取消的位置 int cnt = 0,t,tol = 1;while(scanf("%s",&s) != EOF){if(s[0] != 'c'){scanf(" %lf %d",&price,&num);p.insert(price);if(s[0] == 'b'){stk[tol++] = Stock(1,price,num);}else if(s[0] == 's'){stk[tol++] = Stock(-1,price,num);}}else if(s[0] == 'c'){scanf(" %d",&t);pos[cnt++] = t;stk[tol++] = Stock(0,0.0,0);//为了等下方便cancel 也加上一个无效的stk }}for(int i = 0; i < cnt; ++i){ //cacel i stk[pos[i]] = (Stock){0,0,0};} LL sum_b = 0,sum_s = 0,mmax = -1; // 要用long long double open_price = 0.0;// 遍历每一个可能的开盘价格 取成交量最大时的最大开盘价格 for(set<double>::iterator it = p.begin(); it != p.end(); ++it){double cur_p = *it;sum_b = sum_s = 0;for(int i = 1; i < tol; ++i){Stock _stk = stk[i];if(_stk.type == 1 && _stk.price >= cur_p){sum_b += _stk.num;}if(_stk.type == -1 && _stk.price <= cur_p){sum_s += _stk.num;}}LL cur_max = min(sum_b,sum_s); //成交量为当前buy 与sell的最小值 if(cur_max > mmax){open_price = cur_p;mmax = cur_max;}}printf("%.2f %lld\n",open_price,mmax);return 0;}
这篇关于CSP2014_12_3集合竞价的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!