← 返回编程题库
coding-min-fill-time-vwap-within-bps-band中等免费版2000ms未尝试

最早同时达到目标成交量且边际滑点未超阈值的秒数

Earliest Second Where the Algo Hits Its Volume Target Without Tripping the Slippage Cap

开始编码

实现 solution(cum_vol: list[float], marginal_slip_bps: list[float], target_volume: float, slip_cap_bps: float) -> int。某执行监控工具实时跟踪某智能执行算法的成交流,给出两条等长的逐秒曲线(长度 N):cum_vol[t-1] 是算法到第 t 秒为止累计成交的成交量(单调非减),marginal_slip_bps[t-1] 是到第 t 秒为止最近一秒的边际滑点成本,单位 bps(同样单调非减——刻画算法吃单越深,每一笔追加成交的边际成本就越高)。给定要完成的 target_volume 与逐秒边际滑点上限 slip_cap_bps,返回 [1, N] 中最小的 1 索引整数 T,使得算法已经成交目标量cum_vol[T-1] >= target_volume)且尚未把边际成本推过上限marginal_slip_bps[T-1] <= slip_cap_bps);若不存在这样的 T,返回 -1

solution([10.0, 25.0, 45.0, 70.0, 100.0], [0.5, 1.2, 2.1, 3.5, 5.4], 50.0, 4.0) 返回 4。谓词 (a) cum_vol >= 50 首次成立于 T = 4cum_vol = [10, 25, 45, 70, 100] 中第一个 >= 50 的是 70bisect_left([10, 25, 45, 70, 100], 50.0) + 1 = 3 + 1 = 4。谓词 (b) marginal_slip_bps <= 4.0 最后成立于 T = 4marginal_slip_bps = [0.5, 1.2, 2.1, 3.5, 5.4] 中有 4 个元素 <= 4.00.5, 1.2, 2.1, 3.5),bisect_right([0.5, 1.2, 2.1, 3.5, 5.4], 4.0) = 4。两个谓词同时成立的区间是 [4, 4],故答案为 4solution([5.0, 10.0, 15.0, 20.0, 25.0], [1.0, 2.5, 3.8, 5.2, 7.0], 12.0, 3.0) 返回 -1T_a = 315 >= 12 是首次满足)但 T_b = 2marginal_slip_bps[2] = 3.8 > 3.0,最后满足是第 2 秒),算法在击穿成本上限之后才追上成交量目标,没有任何一秒能同时满足两个条件。solution([3.0, 7.0, 11.0, 18.0], [0.2, 0.5, 0.9, 1.6], 5.0, 5.0) 返回 2T_a = 2cum_vol[1] = 7 >= 5),T_b = 4marginal_slip_bps 每个元素都 <= 5.0),可行区间是 [2, 4],最小的秒数是 2

关键形态是在答案 T 上对同一时间索引上两个反向单调谓词的合取做二分。谓词 (a) 在 T 上是 FALSE-then-TRUE;谓词 (b) 在 T 上是 TRUE-then-FALSE。合取的可行集因此是一段连续的整数区间 [T_a, T_b],其中 T_a 是满足 (a) 的最小 TT_b 是满足 (b) 的最大 T。当 T_a <= T_b 时答案即 T_a,否则返回 -1——这同时覆盖了 (a) 在任何位置都不成立(T_a > N)或 (b) 在任何位置都不成立(T_b == 0)的兜底情形。两次 O(log N) 二分((a) 用 bisect_left,(b) 用 bisect_right)直接给出 T_aT_b,胜过 O(N) 的线性扫描。二分方向((a) 的 >=bisect_left,(b) 的 <=bisect_right)是承重细节:交换会悄悄漏判 cum_vol[T-1] == target_volumemarginal_slip_bps[T-1] == slip_cap_bps 的恰好相等情形。

函数骨架见 stubs/stub.py

实践背景

某智能执行算法(成交量节奏或排程跟随类)在数秒级跨度内对接活跃订单簿,要在守住交易员设定的逐秒边际成本上限(bps)的前提下完成母单的目标成交量。算法吃单越深,每多成交一份的边际成本越高,所以逐秒边际滑点曲线在时间上单调非减;累计成交量曲线在时间上同样单调非减。盘后监控层在拿到这两条逐秒曲线、目标 target_volume 与上限 slip_cap_bps 后,希望定位最早的某一秒,那一秒上算法同时已经完成目标成交量且尚未把边际成本推过上限——这就是给母单打「有效完成时刻」戳的正确点位。T_b - T_a 这个间隔反映的是「滑点达上限的最大 T」与「成交量达目标的最小 T」之间的余量;返回 -1 表示两者没有重叠(成交量赶上目标之前,成本上限就已经被击穿),交易台需要进一步查验是算法节奏还是当日的微观结构状态导致了这次失败。

约束条件

  • 0 <= N <= 5000,其中 N = len(cum_vol) = len(marginal_slip_bps);两条数组均为单调非减
  • 0.0 <= cum_vol[i] <= 1e9(非负浮点,非减);0.0 <= marginal_slip_bps[i] <= 1e6(非负浮点,非减)
  • 0.0 < target_volume <= 1e9;0.0 <= slip_cap_bps <= 1e6
  • 兜底合约(不抛异常):若 N == 0 返回 -1;若 cum_vol[-1] < target_volume 返回 -1;若 marginal_slip_bps[0] > slip_cap_bps 返回 -1;否则返回 [1, N] 中最小的 1 索引 T,使得 cum_vol[T-1] >= target_volume 且 marginal_slip_bps[T-1] <= slip_cap_bps,若不存在返回 -1
  • 输出为单个 int;比较器为 exact
  • 参考解复杂度:时间 O(log N),空间 O(1)(两次二分)

样例

Case 1 · statement-example: cum_vol crosses target on the same second slippage stays within cap

输入: [[10,25,45,70,100],[0.5,1.2,2.1,3.5,5.4],50,4]

期望: 4

谓词(a)首次成立于 T_a=4(70>=50),谓词(b)最后成立于 T_b=4(marginal_slip_bps 中 4 个元素 <= 4.0),区间[4,4],答案 4。

Case 2 · statement-example: slippage breached before volume target met returns -1

输入: [[5,10,15,20,25],[1,2.5,3.8,5.2,7],12,3]

期望: -1

T_a=3(15>=12),T_b=2(marginal_slip_bps[2]=3.8>3.0),T_a>T_b,无重叠,返回 -1。

Case 3 · statement-example: cap never tight feasible window opens at smallest T_a

输入: [[3,7,11,18],[0.2,0.5,0.9,1.6],5,5]

期望: 2

T_a=2(cum_vol[1]=7>=5),T_b=4(每个元素都 <= 5.0),可行区间 [2,4],最小秒数为 2。

最近提交

还没有提交记录。

编码区

实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。

加载编辑器...
计时0:00

默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。

Case 1 · statement-example: cum_vol crosses target on the same second slippage stays within cap

输入: [[10,25,45,70,100],[0.5,1.2,2.1,3.5,5.4],50,4]

期望: 4

谓词(a)首次成立于 T_a=4(70>=50),谓词(b)最后成立于 T_b=4(marginal_slip_bps 中 4 个元素 <= 4.0),区间[4,4],答案 4。

Case 2 · statement-example: slippage breached before volume target met returns -1

输入: [[5,10,15,20,25],[1,2.5,3.8,5.2,7],12,3]

期望: -1

T_a=3(15>=12),T_b=2(marginal_slip_bps[2]=3.8>3.0),T_a>T_b,无重叠,返回 -1。

Case 3 · statement-example: cap never tight feasible window opens at smallest T_a

输入: [[3,7,11,18],[0.2,0.5,0.9,1.6],5,5]

期望: 2

T_a=2(cum_vol[1]=7>=5),T_b=4(每个元素都 <= 5.0),可行区间 [2,4],最小秒数为 2。