ccf-201412-3 集合竞价(详解)

2023-11-12

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的卖单的总股数之间的较小值。
  你的程序需要确定一个开盘价,使得开盘成交量尽可能地大。如果有多个符合条件的开盘价,你的程序应当输出最高的那一个。
输入格式
  输入数据有任意多行,每一行是一条记录。保证输入合法。股数为不超过10^8的正整数,出价为精确到恰好小数点后两位的正实数,且不超过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。


code

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
struct data {
    string a;
    float b;
    long long c;
    int d;
};
struct money {
    float a;
    long long b,s;
};
vector<data> notes;
vector<money> mon;
data temp;
money mtemp;
bool com(data a,data b) {
    if(a.d==b.d&&a.d==1) {
        return a.b<b.b;
    }
    return a.d>b.d;
}
void find(float a,string b,long long c) {
    int i;
    for(i=0; i<mon.size(); i++) {
        if(mon[i].a==a) {
            if(b=="buy") {
                mon[i].b+=c;
            } else {
                mon[i].s+=c;
            }
            break;
        }
    }
    if(i==mon.size()) {
        mtemp.a=a;
        if(b=="buy") {
            mtemp.b=c;
            mtemp.s=0;
        } else {
            mtemp.s=c;
            mtemp.b=0;
        }
        mon.push_back(mtemp);
    }
}
int main() {
    while(cin>>temp.a) {
        if(temp.a=="buy"||temp.a=="sell") {
            cin>>temp.b>>temp.c;
            temp.d=1;
        } else if(temp.a=="cancel") {
            cin>>temp.b;
            notes[temp.b-1].d=0;
            temp.d=0;
        } else {
            break;
        }
        notes.push_back(temp);
    }
    sort(notes.begin(),notes.end(),com);
    for(int i=notes.size()-1; i>-1; i--) {
        if(notes[i].d==1) {
            find(notes[i].b,notes[i].a,notes[i].c);
        } else {
        }
    }
    long long max=-1;
    float order;
    for(int i=0; i<mon.size(); i++) {
        long long sumb=0,sums=0;
        for(int j=0; j<=i; j++) {
            sumb+=mon[j].b;
        }
        for(int j=i; j<mon.size(); j++) {
            sums+=mon[j].s;
        }
        long long m=sumb<sums?sumb:sums;
        if(max<m) {
            max=m;
            order=mon[i].a;
        }
    }
    printf("%.2f %lld\n",order,max);
    return 0;
}

思路解析:

关键语句解析:

1)

cancel i表示撤销第i行的记录

“撤销第i行的记录”: 这里的撤销只是撤销记录本身,被撤销记录所造成的影响不会消失!!!比如:

buy 9.00 100
sell 8.88 200
cancel 2
cancel 3

有效的记录是:

buy 9.00 100

其实只要你认为记录是顺序执行的,从第一条执行到最后一行,那么得出的结果就是正确的,和题意相符(2018年9月7号:测试数据里面有大概50%的数据和此有关,剩下50%无所谓)。不过我在考虑的时候,多想了一些,我之前认为撤销不仅仅撤销记录本身,被撤销记录所造成的影响也会消失!比如上面的例子,有效的记录是:

buy 9.00 100
sell 8.88 200

但这是不符合题意的(我坚持认为,这不能怪我,是题目没有解释清楚),这让我想起高中的时候,老师为出题人辩解的话:“不要过度解读题意,要按照出题人的思路来(我认为这是出题人的水平不行,出题不严谨)”,所以我们不要想的太多(但也不能想的太少),不能过度解读!

2)

保证输入合法

这句话非常有用,这表明不会出现以下的不合理情况:

buy 9.00 100
sell 8.88 200
cancel 2
cancel 2

不会撤销已经被撤销的记录!

3)

股数为不超过10^8的正整数
对于100%的数据,输入的行数不超过5000

这两句话一起说,这表明成交量可能会是一个很大的数,int表示不了这么大的数,需要用long long等范围比较大的数(2018年9月7号:测试数据里面有大概20%的数据需要用long long)。

4)

开盘价需要精确到小数点后恰好两位

需要注意输出格式,用:printf("%.2f %lld\n",(1),(2)); 比较好,“%.2f”表示float类型精确到小数点后恰好两位,“%lld”表示long long类型!

5)

出价为精确到恰好小数点后两位的正实数,且不超过10000.00

几乎没用,可以忽略!

开盘价分析:

!!!开盘价一定是买价中的一个!!!

证明:

  1. 如果开盘价即在买价中,又在卖价中。
    那开盘价已经是买价之一了。
  2. 如果开盘价p1只在卖价中。
    那么在买价中找到与p1价格相差最小,却又比p1大的价格p2。(若找不到p2,p1比买价中的任意价格都要大,此时成交量为0,无意义,不考虑这种情况)当开盘价为p2时,买价中至少为开盘价的总股数与开盘价为p1时相等,卖价中至少为开盘价的总股数会大于或等于开盘价为p1时。所以当开盘价为p2时,成交量要么与开盘价是p1时相等,要么比p1时大。题目中说了,如果有多个符合条件的开盘价,应输出最大的价格,所以此时开盘价应选为p2,即开盘价不可能只在卖价中。
  3. 如果开盘价p1既不在买价中又不在卖价中。
    我们先来定义一个概念,在买价和卖价中找到与p1价格相差最小,却又比p1大的价格,我称之为M价。那么p1会是M价减去0.01(精确到恰好小数点后两位),M价可能是买家、卖价或买卖价。当M价为买价时,开盘价为p1和开盘价为M价没有区别,买价至少为开盘价的总股数和卖价至少为开盘价的总股数都对应相等。当M价为卖价时或即在买价中又在卖价中,开盘价为M价的买价至少为开盘价的总股数与开盘价为p1是相等的,开盘价为M价的卖价至多为开盘价的总股数大于等于开盘价为p1时。题目中说了,如果有多个符合条件的开盘价,应输出最大的价格,所以此时开盘价应选为M价,这就又到了讨论M价的情况了(1、2、3再走一遍)。

此分析借鉴于https://blog.csdn.net/liujiayu1015/article/details/53518842

代码解析:

1、构建结构体data表示每一条记录,属性有a:储存记录标识,b:出价,c:股数,d:是否失效
2、while循环读取每一行记录,用cin即可,当cin的数据不是“buy”、“sell”、“cancel”时跳出循环,读取的记录存入data。
3、读取“cancel”后,立即处理即可,使第某行失效
4、将data按照出价从小到大排序
5、构建结构体money表示每一个出价(包含买价卖价),属性有a:出价,b:买入股数,s:卖出股数
6、按照data的数据初始化money,出价从大到小
7、money中每一项依次定为开盘价,计算成交量,取成交量最大,出价最高的

data形如:

a——–b——–c——–d
cancel-2——-0——–0
sell—-8.88—-200—–1
buy—-9.00—-100—–1

money形如:

a——–b——–s
9.00—100—–0
8.88—0—–200

这样这道题就解决了!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ccf-201412-3 集合竞价(详解) 的相关文章

  • CCF-CSP【202303-3 LDAP】C++

    CCF CSP 202303 3 LDAP C 43 43 CCF真题网址 第一次提交结果超时 只有20分 题目思路 我的思路较为简单 xff0c 即对于每个匹配表达式 xff0c 遍历N个用户 xff0c 验证是否匹配 对于每个表达式有两
  • 【CCF-CSP】 201604-4 游戏

    文章目录 一 题目二 解题1 题目2 代码3 提交结果 总结1 注意边界 一 题目 原题目链接 二 解题 1 题目 类似于迷宫问题 xff0c 假设有一个n行m列的矩阵 xff0c 其中的一些格子是障碍物 xff0c 机器人从 xff08
  • CSP CCF: 202012-2 期末预测之最佳阈值 (C++)

    目录 题目来源题目描述解题过程完整代码 题目来源 链接 CCF 期末预测之最佳阈值 题目描述 解题过程 题目要求为选取合适的安全指数阈值 Theta xff0c 使得该阈值对这 m 位同学上学期的挂科情况进行预测 xff0c 预测正确的次数
  • ccf 画图

    问题描述 试题编号 xff1a 201409 2试题名称 xff1a 画图时间限制 xff1a 1 0s内存限制 xff1a 256 0MB问题描述 xff1a 问题描述 在一个定义了直角坐标系的纸上 xff0c 画一个 x1 y1 到 x
  • C++ CCF真题----画图

    问题描述 用 ASCII 字符来画图是一件有趣的事情 xff0c 并形成了一门被称为 ASCII Art 的艺术 例如 xff0c 下图是用 ASCII 字符画出来的 CSPRO 字样 本题要求编程实现一个用 ASCII 字符来画图的程序
  • CCF CSP 2021-09-2 非零段划分 题解及满分代码(C++11)

    文章目录 问题描述问题分析70分解法满分解法 问题描述 题目描述 A 1 A 2
  • CCF CSP 2021-04-2 邻域均值 题解及满分代码(C++11)

    文章目录 题目描述问题分析70分解法满分解法 题目描述 现给定邻域参数 r 和阈值 t xff0c 试统计输入灰度图像中有多少像素处于较暗区域 输入格式 输入共 n 43 1 行 输入的第一行包含四个用空格分隔的正整数 n L r 和 t
  • CCF CSP 2019-12-1 “报数” 解题思路及满分代码(C++11)

    文章目录 题目描述解题思路满分代码 题目描述 解题思路 题目比较简单 xff0c 需要搞清楚两个点 xff1a 跳过的数是7的倍数或含7的数 xff0c 即取余为0或各个位上有7的数n代表的是总共的报数个数 xff0c 跳过的数是不算的 下
  • CCF_Markdown(正则表达式)

    试题编号 xff1a 201703 3试题名称 xff1a Markdown时间限制 xff1a 1 0s内存限制 xff1a 256 0MB问题描述 xff1a 问题描述 Markdown 是一种很流行的轻量级标记语言 xff08 lig
  • CCF期末预测之最佳阈值

    题目背景 考虑到安全指数是一个较大范围内的整数 小菜很可能搞不清楚自己是否真的安全 xff0c 顿顿决定设置一个阈 xff0c 以便将安全指数 y转化为一个具体的预测结果 会挂科 或 不会挂科 因为安全指数越高表明小菜同学挂科的可能性越低
  • CCF CSP 201512-3 画图

    字符串基础题 问题描述 用 ASCII 字符来画图是一件有趣的事情 xff0c 并形成了一门被称为 ASCII Art 的艺术 例如 xff0c 下图是用 ASCII 字符画出来的 CSPRO 字样 lt 本题要求编程实现一个用 ASCII
  • ccf-csp 期末预测之最佳阈值

    期末预测之最佳阈值 在一开始使用了双重循环的做法 xff0c 没有考虑时间复杂度的问题 xff0c 最终虽然结果正确了 xff0c 但是提交后显示运行时间超时 xff0c 看来复杂度为n2并不满足题目的要求 之后便开始想办法降低复杂度 xf
  • 计算机图形学期刊影响因子,计算机图形学 | CCF推荐期刊专刊信息2条

    原标题 xff1a 计算机图形学 CCF推荐期刊专刊信息2条 图形学与多媒体 Computers amp Graphics Call for papers Shape Modelling International SMI 2019 全文截
  • CCF 201903-4 消息传递接口

  • html+css+js手写练习-仿CCF注册和登录页面

    直接贴代码 xff1a lt DOCTYPE html gt lt html gt lt head gt lt meta charset 61 34 utf 8 34 gt lt title gt 中国计算机学会 注册 lt title g
  • CCF计算机软件能力认证历年真题+超详细解析(C语言)

    这个历年试题解主要使用C语言编写 针对较为简单的第一题和第二题 适合初学者 程序中基本附有注释 希望可以帮到大家 会持续进行补充 欢迎评论区给出更好的解法与思路 2021 12 第 24次 202112 1序列查询 202112 2序列查询
  • CCF/CSP 201409-3 字符串匹配(满分题解Java版)

    此题虽然放在了第三题 但是如果对Java的API了解的比较好的同学 解这道题一点都不难 比前几题都要简单一些 题目描述 官方题目地址 读题请点击 Java满分题解 import java util Scanner next 与 nextLi
  • CCF-CSP真题《202305-1 重复局面》思路+python,c++满分题解

    想查看其他题的真题及题解的同学可以前往查看 CCF CSP真题附题解大全 试题编号 202305 1 试题名称 重复局面 时间限制 1 0s 内存限制 512 0MB 问题描述 题目背景 国际象棋在对局时 同一局面连续或间断出现3次或3次以
  • ccf-201412-3 集合竞价(详解)

    ccf 201412 3 集合竞价 详解 试题编号 201412 3 试题名称 集合竞价 时间限制 1 0s 内存限制 256 0MB 问题描述 问题描述 某股票交易所请你编写一个程序 根据开盘前客户提交的订单来确定某特定股票的开盘价和开盘
  • 第一次CCF CSP认证体验

    今天是我第一次参加CCF CSP认证 虽然这已经是第十二次CCF认证了 感觉题目有点难欸 前面两道题暴力写完 然后看了第三题 哇 简直难写 第四题看了看 数据1e5条边 不会做 就写了一个暴力 希望能过点数据 第五题感觉像是一个动态规划 完

随机推荐

  • 最小生成树----算法导论

    算法导论 上已经解释的非常清楚了 于是直接照搬过来吧 本文转载自 算法导论
  • pyqt5中label等文字字体及背景颜色的设置

    界面背景设置 formObj setStyleSheet MainWindow border image url image background4 png label字体颜色设置 self label setStyleSheet colo
  • VUE预览blob视频流

    无插件 后端最开始返回的数据 把url传给后端转成blob流 然后后端返回的blob流直接播放
  • TS:链表

    链表 有序元素集合 逻辑上存在连续关系 物理上不需要连续存储 单向链表 type ListNode
  • 基于FPGA的图像sobel锐化实现,包括tb测试文件和MATLAB辅助验证

    目录 1 算法运行效果图预览 2 算法运行软件版本 3 部分核心程序 4 算法理论概述 5 算法完整程序工程 1 算法运行效果图预览 将FPGA的仿真结果导入到matlab显示图像效果 2 算法运行软件版本 MATLAB2022a viva
  • python基本数据类型、数据类型的判断、数据类型的转换、算数运算符、赋值运算符、比较运算符

    基本数据类型 python3中有6个标准的数据类型 数值 number 包括整数 int 浮点数 float 复数 complex 布尔值 bool 字符串 string python种字符串要求使用一堆单引号 或者双引号 或者双引号来包裹
  • Flink-1.12.0 CEP详解与实战

    什么是CEP CEP Complex Event Processing 复杂事件处理 一个或多个由简单事件构成的事件流通过一定的规则匹配 然后输出用户想得到的数据 满足规则的复杂事件 Flink CEP简介 Flink CEP是在flink
  • 小程序系列:onLoad,onReady和onShow等生命周期函数的区别和使用

    小程序请求这部分 我们发现有onLoad onReady onShow等都可以调用function发送请求 他们之间有什么区别 首先官方文档先甩出来 这些都是微信页面page这个Object的声明周期函数里面的 其实点进去看定义就可以了 毕
  • mysql分片的几种分配策略 - 固定、动态、固动结合、显示分配等

    假设我们要对用户的数据进行分片存储 依据的是用户id 1 关于固定分配 核心是利用哈希函数将输入的id值映射到一个输出值上 这个输出值就直接是分片id 注意这一点很重要 这是与混合分配策略区分的关键 2 动态分配 动态分配不使用哈希函数 而
  • 【Android】ReactNative实现计算器

    简介 大三学生党一枚 主攻Android开发 对于Web和后端均有了解 语录 取乎其上 得乎其中 取乎其中 得乎其下 以顶级态度写好一篇的博客 做IT行业的相信大部分朋友都开发过计算器的小demo 大部分都是基于C Java Python开
  • 前端系列之jQuery(jQuery事件)

    DOM事件模型 DOM 0级事件模型
  • 绝了!一个妹子 rm -rf 把公司整个数据库删没了...

    作者 zhouyu 来源 cnblogs com zhouyu629 p 3734494 html 经历了两天不懈努力 终于恢复了一次误操作删除的生产服务器数据 对本次事故过程和解决办法记录在此 警醒自己 也提示别人莫犯此错 也希望遇到问题
  • JAVA-程序的编译过程及运行过程

    目录 前言 一 Java程序的执行过程 1 编译期 2 运行期 二 小例子 1 进入cmd窗口 2 编译期 3 运行期 总结 前言 在之前我们做了第一个案例 Hello World 案例 也对其进行了详细的解析 HelloWorld案例 详
  • 【数电】理解MOS管的Vth(增强型)

    其实就是 对NMOS来说 栅极底下是P型半导体 有空穴和B 离子 栅衬之间加电压 电子往栅极底下跑 与空穴复合 此时形成耗尽层 虽然因为B 离子的原因带负电 但无法自由移动 当电压超过Vth 多余电子来到栅极底下 可自由移动 形成沟道
  • C或C++项目实战之贪吃蛇

    编译环境 VS2017 VS其他版本皆可 EasyX图形库 编程语言 c c 当前版本 snakeGame1 0 修改时间 2019 6 13 项目组成 5 1 头文件 snake snake h 5 2 源文件 main cpp snak
  • python获取程序运行过程中所需要的时间

    使用python的过程中 需要得知程序从运行开始到结束所需要的时间 可以使用clock 的方法来实现 引入所需要的时间库 import datetime import time 程序计时器 启动计时器 start time clock 中间
  • conda 环境无法激活的问题

    项目场景 提示 这里简述项目相关背景 例如 项目场景 示例 通过蓝牙芯片 HC 05 与手机 APP 通信 每隔 5s 传输一批传感器数据 不是很大 安装anaconda3 pypcharm pycharm解释器使用anaconda3目录下
  • Dynamics 365 9.0 Version 新功能(1) 支持查找没有Opporunity的Account

    Dynamics 365 升级到9 0版本后 增强了高级查找中相关实体1 N关系的不包含数据的查询 这个功能虽然不太起眼 但是确实很多人期盼已久的 先来看下之前版本的高级查找 我以Accouts为示例 选择查询的相关实体是Opportuni
  • 4.tcp问题及进程

    1 tcp 问题 a 粘包 b 拆包 解决 1 1 解决方案 1 粘包 特殊字符方式 a 当时短连接的情况下 不用考虑粘包的情况 b 如果发送数据无结构 如文件传输 这样发送方只管发送 接收方只管接收存储就ok 也不用考虑粘包 c 如果双方
  • ccf-201412-3 集合竞价(详解)

    ccf 201412 3 集合竞价 详解 试题编号 201412 3 试题名称 集合竞价 时间限制 1 0s 内存限制 256 0MB 问题描述 问题描述 某股票交易所请你编写一个程序 根据开盘前客户提交的订单来确定某特定股票的开盘价和开盘