目录
正在加载目录...

Optiver OA 题目分享|90 分钟长模拟题状态机,细节是关键

8 月 18 日做了一场 Optiver OA ,这场比较特别:90 分钟基本就是一道大题,题面超长,光把所有规则读明白就花了将近半小时。但真正理清楚之后,代码写起来反而挺顺,120 行左右,没有用到什么复杂数据结构,就是老老实实的状态机模拟。

Optiver OA 题目分享|90 分钟长模拟题状态机,细节是关键

Optiver OA 题目:Power Cell Bank

Optiver OA 题目分享|90 分钟长模拟题状态机,细节是关键

题意理解

题面一上来先介绍背景,大意是:有若干层机架(rack),电芯(cell)装进去,负载按批次取用。机架从前到后编号 0、1、2……容量分别是 2⁰、2¹、2²……指数增长。

然后要实现三个方法:

LoadCell,把一块新电芯装进最靠前还有空位的机架。电芯有个 rated_duration,从装入时刻算起,在这段时间内算”带电”,超了就算”耗尽”,再过一段就变成”spent”,位置可以被新电芯占用。

Discharge,每次调用先做一次电荷均衡(Equalisation),然后从前架开始往后取,最多取 max_dispatch 块,返回每块电芯的 id 和当前状态(charged 或 depleted)。

这里有个关键:Equalisation 是在取之前做的,顺序不能反。我第一遍读的时候没注意这个,后来对着例子走了一遍才发现顺序错了。

解题思路

读题阶段卡了两次。

第一次是看到”spent cell 的位置算空位”这句话——意思是 LoadCell 找空位的时候,spent 状态的格子可以被覆盖,但 charged 和 depleted 状态的不行。这个细节藏在一句话里,跳过了就会写错。

第二次是 Equalisation 的具体规则。题面对这块的描述比较抽象,我花了不少时间对着例子推算它到底在做什么——大意是在相邻架之间平衡有效电荷(仍处于 rated 窗口的电芯数量),让前架优先,后架补给。规则清楚了之后实现并不复杂,就是按顺序更新每对相邻架的状态。

代码思路

确认理解正确之后,我先在纸上画了架-电芯-时间戳的关系,再定好数据结构:每层机架用一个列表存电芯,每块电芯记 id、装入时间、rated_duration。

时间状态用懒更新——不按 tick 全量扫描,只在 LoadCell 和 Discharge 调用时,根据传入的 timestamp 判断哪些电芯已经过期。这样数据量大了也不会超时。

Discharge 严格按顺序:先跑 Equalisation,再做 Bus Shift 弹出。弹出的时候根据当前 timestamp 和装入时间加 rated_duration 的比较,判断是 charged 还是 depleted,拼成字符串放进返回列表。

边界处理了这几个:全满时 LoadCell 返回 false;Discharge 时库空了提前结束;已取出或 spent 的 cell_id 可以被下次 LoadCell 复用;同一 id 在非 spent 状态下不能重复装入。

做完的感受

这道题考的不是你会不会某个算法,考的是你在一大段规则面前能不能保持清醒——把状态理清楚、把顺序搞对、把边界覆盖全。真正的时间消耗在读题和验证理解,不在写代码。

Optiver OA 基本都是这个路子,换皮不换魂。建议备考的时候少刷纯算法,多练”多实体+时间驱动”的 OO 建模,银行账户、订单撮合、任务调度这类都很有代表性,练的时候重点关注操作顺序和状态转换有没有写对。

有在准备 Optiver 或其他做市商 OA 的同学,可以来找我们聊聊。我们是 InterviewShow,长期跟进 Optiver、Jane Street、DRW 这类量化公司的题型,对这种长模拟题有专门的准备方案,一对一跟着走。有需要的来聊。

END