← 返回编程题库
coding-max-reward-disjoint-resource-bitmask-subset中等免费版2000ms未尝试

在风险桶预算位掩码下的非交叠对冲合约最大收益选择

Disjoint Risk-Bucket Hedge Selection under a Bucket-Budget Bitmask

开始编码

某组合对冲方面对 B 个互不重叠的风险桶——例如按行业或期限切分的因子敞口——每个桶具有有限且不可替代的名义额度,且不可在多个合约之间拆分。本期桌台拥有一个整数 budget_mask,标记本期可用的桶集合,以及 N 个候选对冲合约。合约 i 的整数位掩码 cost_masks[i] 列出它将整桶吃下的风险桶(整张合约占走每个所列桶的全部名义,桶不能被多张合约共享),同时附带一个实数 rewards[i](例如该对冲的预期 P&L 或预期方差削减)。挑选合约子集 S 使总回报最大,且需满足 (a) 每个被选合约的 cost_masks[i] 都是 budget_mask 的子掩码;(b) 被选合约的 cost 掩码两两不相交(任意两张合约不共享任何桶位)。

实现 solution(rewards: list[float], cost_masks: list[int], budget_mask: int) -> float。返回最大可达总回报。空子集恒为可行解、回报 0.0,因此返回值非负——若所有候选合约都不合规(例如都有桶位落在 budget_mask 之外),则返回 0.0。输入满足 len(rewards) == len(cost_masks)

例如,solution([10.0, -5.0, 3.0, 8.0], [1, 2, 4, 6], 7) 返回 18.0。其中 budget_mask = 7(二进制 111)涵盖了全部四张合约的 cost 掩码。cost 掩码 1(二进制 001)与 cost 掩码 6(二进制 110)互不相交,合计 10.0 + 8.0 = 18.0;另一个互不相交的子集 {cost 1, cost 2, cost 4} = {001, 010, 100} 仅得 10.0 + (-5.0) + 3.0 = 8.0;任何共享桶位的两张合约(例如 cost 2 与 cost 6)不合规。再如 solution([5.0, 4.0], [3, 3], 3) 返回 5.0——两张合约消耗同一组桶,至多取其一,取较大回报。

具体函数骨架见 stubs/stub.py

实践背景

非交叠桶容量约束在桌台把有限且不可分割的存量分摊给若干竞争性对冲时随处可见:不能在两笔交易之间拆分的期限分桶 swap 名义、按 mandate 配置的行业 beta 容量、单笔卖空就把额度吃完的 prime broker locate 库存、单只结构性产品就吃满整桶的因子分桶 VaR 限额。位掩码框架——每张合约的"成本"是它所占用的桶集合,两张合约冲突当且仅当二者 cost 掩码共享位——把"互不相交"约束本地化,优化变成了直接的 O(N * 2^B) 位掩码 DP。当 B 很小(桌台的风险分类至多十来个桶)且 N 很小(候选对冲清单可控)时,DP 跑在微秒级,直接喂入资本配置讨论:最大回报是本期对冲清单可贡献的上界,把它锁定下来,PM 就能据此谈判下一期要释放哪些桶以越过这一上界。

约束条件

  • 0 <= N <= 18,其中 N = len(rewards) = len(cost_masks)
  • 0 <= B <= 12(风险桶数);0 <= budget_mask < 2^B
  • 1 <= cost_masks[i] < 2^B(每个合约至少消耗一个桶,禁止 cost_masks[i] = 0)
  • |rewards[i]| <= 1e6(有限带符号浮点数)
  • 被选合约的 cost_masks 两两不相交,且每个 cost_masks[i] 都必须是 budget_mask 的子掩码
  • 空子集恒可行且回报为 0.0;如不存在更优子集,返回 0.0
  • 浮点比较容差:rel_tol = 1e-9, abs_tol = 1e-9

样例

Case 1 · statement-example: 4 contracts mask 7

输入: [[10,-5,3,8],[1,2,4,6],7]

期望: 18

{cost 1, cost 6} 两两不相交且都是 budget_mask=7 的子掩码,合计 10.0+8.0=18.0,优于其他可行子集。

Case 2 · statement-example: identical masks pick max

输入: [[5,4],[3,3],3]

期望: 5

两张合约都消耗 cost=3 的同一组桶,至多取其一,取较大回报 5.0。

Case 3 · typical: three pairwise-disjoint contracts all fit

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

期望: 6

三张合约 cost 掩码 {001, 010, 100} 两两不相交且都在 budget=7 内,合计 1.0+2.0+3.0=6.0。

Case 4 · typical: single contract exact-budget

输入: [[7.5],[5],5]

期望: 7.5

唯一合约 cost=5 恰好是 budget=5,直接选取,回报 7.5。

Case 5 · typical: cost outside budget filtered

输入: [[100,5],[4,1],1]

期望: 5

cost=4 包含 budget=1 之外的桶,被过滤;只剩 cost=1,回报 5.0。

Case 6 · boundary: empty inputs

输入: [[],[],0]

期望: 0

无候选合约,空子集是唯一可行解,返回 0.0。

Case 7 · boundary: all negatives never selected

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

期望: 0

所有合约回报均为负,空子集最优,返回 0.0。

最近提交

还没有提交记录。

编码区

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

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

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

Case 1 · statement-example: 4 contracts mask 7

输入: [[10,-5,3,8],[1,2,4,6],7]

期望: 18

{cost 1, cost 6} 两两不相交且都是 budget_mask=7 的子掩码,合计 10.0+8.0=18.0,优于其他可行子集。

Case 2 · statement-example: identical masks pick max

输入: [[5,4],[3,3],3]

期望: 5

两张合约都消耗 cost=3 的同一组桶,至多取其一,取较大回报 5.0。

Case 3 · typical: three pairwise-disjoint contracts all fit

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

期望: 6

三张合约 cost 掩码 {001, 010, 100} 两两不相交且都在 budget=7 内,合计 1.0+2.0+3.0=6.0。

Case 4 · typical: single contract exact-budget

输入: [[7.5],[5],5]

期望: 7.5

唯一合约 cost=5 恰好是 budget=5,直接选取,回报 7.5。

Case 5 · typical: cost outside budget filtered

输入: [[100,5],[4,1],1]

期望: 5

cost=4 包含 budget=1 之外的桶,被过滤;只剩 cost=1,回报 5.0。

Case 6 · boundary: empty inputs

输入: [[],[],0]

期望: 0

无候选合约,空子集是唯一可行解,返回 0.0。

Case 7 · boundary: all negatives never selected

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

期望: 0

所有合约回报均为负,空子集最优,返回 0.0。