← 返回编程题库
coding-max-carry-with-bounded-flip-count困难免费版4000ms未尝试

限定反转次数下的累计 carry 最大化

Maximum Cumulative Carry Under a Bounded Sign-Flip Budget

开始编码

实现 solution(daily_carry: list[float], max_flips: int) -> float。给定 N 期每日 carry 预测 daily_carry(每个元素为有符号浮点数——当执行台账面以 sign +1 持有时该日可记入的 carry)、以及在 N 天内可用的"端日反转再平衡"次数硬上限 max_flips,返回在所有满足"不超过 max_flips 次反转"的符号轨迹下,可达成的累计 carry 最大值。第 d 天执行台累计 daily_carry[d] * sign[d];初始 sign 取值 +1(即第 0 天起始符号);在任意一天 d 的起始(包括第 0 天)可执行一次反转 sign[d] = -sign[d-1],该反转消耗一次 max_flips 配额且发生在当日累计之前。第 0 天反转意味着整段以 sign = -1 运行。

例:solution([0.5, -0.8, 0.3, -0.4, 0.6], 2) 返回 2.0。最优符号轨迹 [+1, -1, -1, -1, +1] 用尽两次反转预算(第 1 天一次、第 4 天一次),每日贡献 [0.5, 0.8, -0.3, 0.4, 0.6] 累计为 2.0。当 max_flips = 0 时整段被迫保持 sign = +1,只能记入 0.5 - 0.8 + 0.3 - 0.4 + 0.6 = 0.2;两次反转预算把累计 carry 抬高了 1.8

测试集显式区分若干边界:N = 0 返回 0.0(没有可累计的天数);max_flips = 0 必须精确返回 sum(daily_carry)(sign 被锁定在 +1);daily_carry 全为负且 max_flips >= 1 时必须在第 0 天反转、整段以 sign = -1 累计、返回 -sum(daily_carry)。参考实现 O(N * max_flips) 时间、O(max_flips) 空间——按当前符号维护两行滚动数组。"反转日子集"的指数级枚举在最大隐藏样例 (N = 1500, max_flips = 1500) 上不可行。

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

实践背景

某 carry 套息执行台收到未来 N 天的每日 carry 预测——条目可能为正(账面以 long-carry 方向持有时当日可记入 carry)或为负(同样的暴露在该日反向支付 carry)——且面临 max_flips 次"端日 long-carry / short-carry 反向"再平衡的硬上限。每次反转的运营成本足够高,以致执行台把"反转次数"本身视作硬约束(而非按笔扣固定金额的费率),常见原因是每一次反转事件都触发一套独立流程(通知、归因、审计),执行台出于治理考量将每节交易内的反转事件数限定在 K 次以内。函数 solution(daily_carry, max_flips) 返回该反转预算下、在完美预知 daily_carry 的前提下可达成的累计 carry 上界——用作"capture ratio"(策略捕获率)的分母,对一个候选择时模型的实盘 PnL 做评分。执行台据此论证"即便我们预先知晓 daily_carry 预测、且服从 K 次反转上限,可达上限也只是 X,故捕获到 0.6X 的候选模型是相对一个诚实上界做得不错,而不是相对一个无界幻想做得不错"。该数字并非任何可交易策略的实盘 PnL——一个能逼近它的模型多半已对预测过拟合。

约束条件

  • 0 <= N <= 1500,其中 N 为 solution(daily_carry, max_flips) 的 daily_carry 输入长度;N = 0 必须返回精确的 0.0
  • 0 <= max_flips <= 1500;max_flips 为整数;max_flips = 0 时整段 N 天 sign 锁定为 +1;max_flips > N 时等价于 max_flips = N(最多反转 N 次)
  • 每个 daily_carry[d] 为有限有符号浮点数,|daily_carry[d]| <= 1e6
  • 执行台不被强制反转;max_flips 是预算上限而非目标。最优符号轨迹可能严格少于 max_flips 次反转
  • 输出为有限浮点数(最优符号轨迹下的累计 carry);比较器为 float,rel_tol = 1e-9,abs_tol = 1e-9

样例

Case 1 · statement-example: K=2 flips on days 1 and 4 yield total 2.0

输入: [[0.5,-0.8,0.3,-0.4,0.6],2]

期望: 2

第 1 天与第 4 天各做一次反转,符号轨迹为 [+1,-1,-1,-1,+1],每日贡献 [0.5,0.8,-0.3,0.4,0.6],累计 2.0。

Case 2 · statement-example: K=0 forces sign=+1 across all five days, return raw sum

输入: [[1.5,-0.5,0.25,-2,0.75],0]

期望: 0

max_flips=0 时整段保持 +1,结果即为 daily_carry 的原始累和 = 1.5-0.5+0.25-2.0+0.75 = 0.0。

Case 3 · statement-example: all-negative stream with max_flips>=1 flips on day 0

输入: [[-1,-2,-3,-4],1]

期望: 10

所有 daily_carry 都为负,单次反转预算下最优策略是第 0 天即反转,整段以 sign=-1 累计,结果为 |sum| = 10.0。

最近提交

还没有提交记录。

编码区

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

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

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

Case 1 · statement-example: K=2 flips on days 1 and 4 yield total 2.0

输入: [[0.5,-0.8,0.3,-0.4,0.6],2]

期望: 2

第 1 天与第 4 天各做一次反转,符号轨迹为 [+1,-1,-1,-1,+1],每日贡献 [0.5,0.8,-0.3,0.4,0.6],累计 2.0。

Case 2 · statement-example: K=0 forces sign=+1 across all five days, return raw sum

输入: [[1.5,-0.5,0.25,-2,0.75],0]

期望: 0

max_flips=0 时整段保持 +1,结果即为 daily_carry 的原始累和 = 1.5-0.5+0.25-2.0+0.75 = 0.0。

Case 3 · statement-example: all-negative stream with max_flips>=1 flips on day 0

输入: [[-1,-2,-3,-4],1]

期望: 10

所有 daily_carry 都为负,单次反转预算下最优策略是第 0 天即反转,整段以 sign=-1 累计,结果为 |sum| = 10.0。