CCF-201412-3-集合竞价

本文探讨了一种数学问题,即如何确定集合竞价的开盘价,以实现买单和卖单的最大成交量。策略是从买单价格开始寻找开盘价,因为开盘价总是位于买单之中。通过比较买单和卖单,找到能达成最大交易量的价格。此外,还提出了使用队列优化的方法,通过排序和比较来更新最大交易量和交易价格,直到所有订单完成或无法继续交易。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题不算是模拟,算数学题吧。这道题也是要细心。

思路

  1. 定的开盘价要使得买单和卖单的成交量最大就是尽可能多的把买单和买单进行匹配。成交量就是买单数和卖单数的最小值。
  2. 如图
    题目用例图解
    从buy买价开始找开盘价,每一个开盘价,从开盘价往上求出总买单数,往下找出总卖单数,找买卖单最小值,更新最大卖单数。

注意
为什么要从买单开始找开盘价,而不是暴力的每个价格试?
可以证明开盘价永远在买单中。简单的举个栗子,假定客人买东西有10元,东西成本卖5元,给你定价,你会定多少才挣钱?肯定10元啊。所以定价是看客人有多少钱,一样的道理,开盘价永远看买单的价格。
用图说话,看下图,稍微改了下数据。在价格轴上,定价杆(开盘价)在某个价格区间之内都可以达到最大交易量,当然就把杆往上抬,碰到买价为止,所以一定从买价中找开盘价。
在这里插入图片描述

ip = []
cancel_list = []
try:
    while True:
        s = input().split()
        if s[0] == 'cancel':
            cancel_list.append(int(s[1]) - 1)
        ip.append(s)
except EOFError:
    pass

buy, sell = {
   }, {
   }
for i in range(len(ip)):
    if i not in cancel_list and ip[i][0] != 'cancel':
        if ip[i][0] == 'buy':
            if float(ip[i][1]) in buy:
                buy[
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值