限定反转次数下的累计 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 可见样例;服务端提交会运行可见样例和隐藏测试。
默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。
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。