在「占用天数」上二分答案;判定函数是「末次考试日 + 复习额度贪心」,而不是简单的段和阈值判断。
目标:最小化前缀长度 D,使前 D 天内 m 门科目全部考完。
单调性:前 D 天可行 ⇒ 前 D+1 天可行,故二分最小 D;若 D=n 仍不可行则返回 -1。
判定 ok(D)
某团队要在连续 n 个工作日内完成 m 门合规认证科目的上机考核(科目编号为 1∼m)。排班表是长度为 n 的数组 slots:
规则如下:
slots 允许该科目的某一天考试slots 本身保证至多一个科目)请返回:从第 0 天起,至少需要占用前多少天(即最短前缀长度),才能让 m 门科目全部考完。若在全部 n 天内仍不可能,返回 -1。
补充约定:
slots 为 0 的天」以及「有考试名额但你选择不在那天考、拿来复习」的天请实现:
minPassDays(slots: int[], prep: int[]) -> int
两行:
slotsprep约束:
一个整数:最短前缀天数;不可能则 -1。
输入:
[0, 1, 0, 2, 1, 0, 2]
[2, 1]
输出:
5
说明:只看前 5 天 [0,1,0,2,1]。一种方案:第 0、1 天复习科目 1,第 4 天考科目 1;第 2 天复习科目 2,第 3 天考科目 2。前 4 天不够完成两门。
输入:
[0, 0, 1, 2, 3, 0, 2, 0, 1, 2]
[1, 1, 4]
输出:
9
说明:科目 3 需要 4 天复习,必须尽早囤复习日,并在第 4 天考掉;之后再安排科目 2、1。前 9 天刚好够,更短前缀不够。
输入:
[1, 1, 1, 1, 1]
[5]
输出:
-1
说明:唯一科目需要 5 天复习再考试,但总共只有 5 天且每天都只能考试、挤不出 5 个复习日。
本题属于以下题库,请选择所需题库进行购买
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.