CCF CSP 201412-3 集合竞价

时间:2022-09-06 15:01:20

CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址

CCF CSP 201412-3 集合竞价

问题描述

  某股票交易所请你编写一个程序,根据开盘前客户提交的订单来确定某特定股票的开盘价和开盘成交量。
  该程序的输入由很多行构成,每一行为一条记录,记录可能有以下几种:
  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。

解析

首先根据“如果有多个符合条件的开盘价,你的程序应当输出最高的那一个”,开盘价一定是一个买入价或者卖出价。

对于股票,有人在1、2、3、4分别卖出10、10、10、10,那么在开盘价为1、2、3、4时,分别能成交10、20、30、40。故成交量是一个累积函数。对于买入操作也是一个累积函数,不过是从最高价往最低价累积。
首先对所有的卖出操作排序,计算价格为所有操作价格的累积卖出量及累积买入量。二者取最小值,就是开盘价为此价格时的成交量。
题意需要注意的是:cancel i表示撤销第i行的记录。而不是撤销第i条合法操作。
排序的时候首先根据价格排序,价格相同时应该让sell在buy之前。

代码

C++
#include <iostream>
#include <iomanip>
#include <string>
#include <vector>
#include <algorithm>
using namespace std; struct Tran {
int t; // 0:sell, 1:buy, 2:cancel
double p;
int s;
Tran(bool t_, double p_, int s_) : t(t_), p(p_), s(s_) {}
bool operator<(const Tran &other) const {
if(p < other.p) return true;
else if(p == other.p && t < other.t) return true;
return false;
}
}; int main() {
string t;
double p;
int s;
int id;
vector<Tran> trans;
while(cin >> t) {
if(t == "buy") {
cin >> p >> s;
trans.push_back(Tran(, p, s));
}
else if(t == "sell") {
cin >> p >> s;
trans.push_back(Tran(, p, s));
}
else if(t == "cancel") {
cin >> id;
trans[id-].s = ;
trans.push_back(Tran(, , ));
}
}
sort(trans.begin(), trans.end());
vector<long long> sellCum(trans.size()), buyCum(trans.size());
long long cum = ;
for(int i=; i<trans.size(); i++) {
if(trans[i].t==) {
cum += trans[i].s;
}
sellCum[i] = cum;
}
cum = ;
for(int i=trans.size()-; i>=; i--) {
if(trans[i].t==) {
cum += trans[i].s;
}
buyCum[i] = cum;
}
double bestP;
long long bestS = ; for(int i=; i<trans.size(); i++) {
long long s = min(sellCum[i], buyCum[i]);
if(s >= bestS) {
bestP = trans[i].p;
bestS = s;
}
}
printf("%.2lf %lld", bestP, bestS);
}

CCF CSP 201412-3 集合竞价的更多相关文章

  1. CCF CSP 认证

    参加第八次CCF CSP认证记录 代码还不知道对不对,过两天出成绩. 成绩出来了,310分. 100+100+100+10+0: 考试13:27开始,17:30结束,提交第4题后不再答题,只是检查前四 ...

  2. CCF CSP 201609-2 火车购票

    题目链接:http://118.190.20.162/view.page?gpid=T46 问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配. 假设一节车厢有20排.每一排 ...

  3. CCF CSP 201703-3 Markdown

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201703-3 Markdown 问题描述 Markdown 是一种很流行的轻量级标记语言(l ...

  4. CCF CSP 201703

    CCF CSP 2017·03 做了一段时间的CCF CSP试题,个人感觉是这样分布的 A.B题基本纯暴力可满分 B题留心数据范围 C题是个大模拟,留心即可 D题更倾向于图论?(个人做到的D题基本都是 ...

  5. CCF CSP 201312-3 最大的矩形

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201312-3 最大的矩形 问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i( ...

  6. CCF CSP 201609-3 炉石传说

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201609-3 炉石传说 问题描述 <炉石传说:魔兽英雄传>(Hearthston ...

  7. CCF CSP 201403-3 命令行选项

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201403-3 命令行选项 问题描述 请你写一个命令行分析程序,用以分析给定的命令行里包含哪些 ...

  8. CCF CSP 201709-4 通信网络

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201709-4 通信网络 问题描述 某国的军队由N个部门组成,为了提高安全性,部门之间建立了M ...

  9. CCF CSP 201409-3 字符串匹配

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201409-3 字符串匹配 问题描述 给出一个字符串和多行文字,在这些文字中找到字符串出现的那 ...

随机推荐

  1. DISP&lowbar;FUNCTION用法

    DISP_FUNCTION(theClass, pszName, pfnMember, vtRetVal, vtsParams ) 参数 theClass 类名. pszName 扩展函数名. pfn ...

  2. 跳跃表Skip List【附java实现】

    skip list的原理 Java中的LinkedList是一种常见的链表结构,这种结构支持O(1)的随机插入及随机删除, 但它的查找复杂度比较糟糕,为O(n). 假如我们有一个有序链表如下,如果我们 ...

  3. response妙用

    1.弹框提示信息 response.getWriter().print("<script>alert('文件不存在或已删除!');</script>"); ...

  4. 经验总结:按需加载JS和css

    项目中做过这样的事情:所有页面都通过SSI指令 include这样一份public-js.shtml, 用来引入涉及到的js(包括公共的脚本 验证插件 自定义组件等),但是一些没有交互效果的页面根本不 ...

  5. java做帐户登录失败锁定

    对于连续失败登录应用系统5次的帐号,需锁定该帐号至少30分钟不允许登录. 这里也用简单的map集合进行判定,功能能实现,但并不是很完美,不用更改数据库的表字段 1.首先建立一个用户登陆失败的实体类 p ...

  6. how tomcat works 读书笔记&lpar;二&rpar;----------一个简单的servlet容器

    app1 (建议读者在看本章之前,先看how tomcat works 读书笔记(一)----------一个简单的web服务器 http://blog.csdn.net/dlf123321/arti ...

  7. 廖雪峰Java4反射与泛型-2注解-3处理注解

    1.处理注解 注解本身对对代码逻辑没有任何影响 SOURCE类型的注解在编译期就被丢掉了 CLASS类型的注解仅保存在class文件中 RUNTIME类型的注解在运行期可以被读取 如何使用注解由工具决 ...

  8. codeforces水题100道 第二题 Codeforces Beta Round &num;4 &lpar;Div&period; 2 Only&rpar; A&period; Watermelon &lpar;math&rpar;

    题目链接:http://www.codeforces.com/problemset/problem/4/A题意:一个整数能否表示成两个正偶数的和.C++代码: #include <cstdio& ...

  9. centos系统下禁用笔记本触控板

    最近把零几年的老爷笔记本拿出来用,使用windows系统实在太卡了,于是折腾安装上Centos系统了,但是在使用的过程中发现鼠标经常失效.使用了多种方法(比如:http://blog.csdn.net ...

  10. PAT 1007 Maximum Subsequence Sum(最长子段和)

    1007. Maximum Subsequence Sum (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Y ...