← 返回编程题库
coding-earliest-k-orders-cooldown-thresholds中等免费版2000ms未尝试

序列化限价单 —— 含逐单触发价与强制冷却间隔的第 K 单最早触发日

Sequenced Limit Orders — Earliest K-th Fire Day With Per-Order Threshold And Cooldown Gap

开始编码

实现 solution(prices: list[float], thresholds: list[float], cooldown: int) -> int。交易台有一个由 K 张序列化限价买单组成的队列,必须按顺序触发:先第 1 单,再第 2 单……最后第 K 单。第 k 单(1-indexed)允许在日 t 触发当且仅当 prices[t] <= thresholds[k-1]非严格不等式 —— 价格恰等于阈值时也允许触发)。各单必须依序触发:第 k+1 单不得早于第 k 单触发。第 k 单于日 t 触发后,第 k+1 单最早可于日 t + cooldown + 1 触发 —— 即触发日本身被占用,之后还要再过 cooldown纯净日才能触发下一单。所以 cooldown == 0 表示相邻两日触发也可以;cooldown == 1 表示两次触发之间必须完全跳过恰好一个纯净日;以此类推。每张单一旦触发,总在最早的合法日触发(交易台的下单规则即"一旦合法立刻触发")。如果某一步从该单的最早可触发日起没有任何日满足阈值条件 —— 包括最早可触发日已经超过 N - 1 的情形 —— 则序列失败。

返回第 K 单触发的 0-indexed 日号;若无可行序列则返回 -1

solution([1.05, 1.20, 0.95, 1.10, 0.90, 1.00, 0.85, 1.15], [1.10, 0.95, 0.90], 1) 返回 4。设 start_day = 0cooldown = 1(故 step = cooldown + 1 = 2):第 1 单(阈值 1.10)于日 0 触发,因 prices[0] = 1.05 <= 1.10;推进 start_day = 0 + 2 = 2。第 2 单(阈值 0.95)从日 2 起扫描;prices[2] = 0.95 <= 0.95(非严格),于日 2 触发;推进 start_day = 2 + 2 = 4。第 3 单(阈值 0.90)从日 4 起扫描;prices[4] = 0.90 <= 0.90,于日 4 触发。返回 4。注意日 1prices[1] = 1.20)本身就不满足第 1 单阈值;而且即便 prices[1] 恰好低于 0.95,cooldown 也会阻止第 2 单在日 2 之前触发。再看 solution([1.0, 2.0, 3.0], [1.0, 0.5], 0) 返回 -1:第 1 单于日 0 触发,但日 1 起没有 prices[t] <= 0.5 的日,第 2 单无法触发,序列失败。

实践背景

交易台为一系列分批限价买单设计了下单规则:每张单有自己的限价("阈值"),并由一道运营节流(即 cooldown)规定相邻两次触发之间必须完全跳过固定数目的纯净日 —— 比如为了避免市场足迹集中在单一交易时段,或为了遵守内部节奏指引(每次成交需经确认与对账后,下一片才能进入工作)。给定一条候选价格录像(可以是用于回测的历史回放,也可以是预测情景),问题是:整套包含 K 张单的下单计划最早何时完成 —— 即第 K 单何时触发?该数字驱动下游若干计算:完成时间分布、所需对冲时间窗,以及在交易者的风险时限约束下当前下单设计究竟是否可行(-1 哨兵:在该价格录像下设计不可行,需要重新参数化)。本题纯粹是"最早完成时间"序列化问题,关注持仓曲线与离场时机的 PnL 最大化问题不同 —— 这里每张单都是触发即忘,唯一决策是"立即触发还是再等一天",最优策略就是平凡的贪心。

实现细节由 stubs/stub.py 提供。

约束条件

  • 1 <= N <= 5000,其中 N 为 solution(prices, thresholds, cooldown) 的 prices 输入长度
  • 1 <= K <= 100,其中 K 为 thresholds 长度;第 k 单(1-indexed)使用 thresholds[k-1] 作为限价
  • 0 <= cooldown <= 1000;cooldown 是非负整数,表示两次相邻触发之间必须**完全跳过**的纯净日数;若第 k 单于日 t 触发,则第 k+1 单最早可于日 t + cooldown + 1 触发
  • 0.001 <= prices[i] <= 1e6 且 0.001 <= thresholds[k] <= 1e6(正浮点;无零、无负值、无 NaN/inf)
  • 输出为 int:第 K 单触发的 0-indexed 日号;若无可行序列则返回 -1;比较器为整数严格相等;触发条件非严格(prices[t] <= thresholds[k-1])

样例

Case 1 · statement-example: 8-day tape with 3 thresholds, cooldown=1 -> day 4

输入: [[1.05,1.2,0.95,1.1,0.9,1,0.85,1.15],[1.1,0.95,0.9],1]

期望: 4

第 1 单阈值 1.10 在日 0 触发(1.05<=1.10),推进 start_day=2;第 2 单阈值 0.95 在日 2 触发(0.95<=0.95),推进 start_day=4;第 3 单阈值 0.90 在日 4 触发(0.90<=0.90)。返回 4。

Case 2 · statement-example: 3-day tape with order 2 infeasible -> -1

输入: [[1,2,3],[1,0.5],0]

期望: -1

第 1 单阈值 1.0 在日 0 触发,推进 start_day=1;第 2 单阈值 0.5 从日 1 起扫描,prices[1]=2.0、prices[2]=3.0 均超过 0.5。返回 -1。

Case 3 · statement-example: cooldown=0 four-order sequence -> day 3

输入: [[2,1,3,1.5],[2,1,3,1.5],0]

期望: 3

cooldown=0 时各单可于相邻日触发:第 1 单日 0(2.0<=2.0)、第 2 单日 1(1.0<=1.0)、第 3 单日 2(3.0<=3.0)、第 4 单日 3(1.5<=1.5)。返回 3。

最近提交

还没有提交记录。

编码区

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

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

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

Case 1 · statement-example: 8-day tape with 3 thresholds, cooldown=1 -> day 4

输入: [[1.05,1.2,0.95,1.1,0.9,1,0.85,1.15],[1.1,0.95,0.9],1]

期望: 4

第 1 单阈值 1.10 在日 0 触发(1.05<=1.10),推进 start_day=2;第 2 单阈值 0.95 在日 2 触发(0.95<=0.95),推进 start_day=4;第 3 单阈值 0.90 在日 4 触发(0.90<=0.90)。返回 4。

Case 2 · statement-example: 3-day tape with order 2 infeasible -> -1

输入: [[1,2,3],[1,0.5],0]

期望: -1

第 1 单阈值 1.0 在日 0 触发,推进 start_day=1;第 2 单阈值 0.5 从日 1 起扫描,prices[1]=2.0、prices[2]=3.0 均超过 0.5。返回 -1。

Case 3 · statement-example: cooldown=0 four-order sequence -> day 3

输入: [[2,1,3,1.5],[2,1,3,1.5],0]

期望: 3

cooldown=0 时各单可于相邻日触发:第 1 单日 0(2.0<=2.0)、第 2 单日 1(1.0<=1.0)、第 3 单日 2(3.0<=3.0)、第 4 单日 3(1.5<=1.5)。返回 3。