1 条题解
-
0
问题理解
我们有一个长度为 的走廊,每扇门要么开()要么关()。Yousef 从第 扇门开始,必须按顺序通过所有门到达出口。他有一个特殊按钮,最多使用一次,按下后所有关着的门会打开并持续 秒。
关键观察
-
最优策略:当遇到关着的门时才按按钮,而不是在开着的门时按。因为提前按只会浪费按钮的有效时间。
-
核心问题:我们需要找到所有关着的门中,最左边和最右边的位置。因为按钮一旦按下,所有关着的门都会打开,但持续时间为 秒。
-
区间长度:令:
- = 最左边关着的门的位置(索引从 开始)
- = 最右边关着的门的位置(索引从 开始)
那么需要按钮效果覆盖的区间长度 = (表示从第 扇门到第 扇门共有多少扇门)。
-
时间需求:
- 每通过一扇门需要 秒
- 从第 扇门到第 扇门,需要连续通过 扇门
- 因此按钮效果持续时间 必须
为什么这样是正确的?
因为:
- 所有关着的门都位于区间 内
- 开着的门不需要按钮帮助
- 如果按钮持续时间足够覆盖从第一个关着的门到最后一个关着的门,那么当你在第 扇门按下按钮时,直到你通过第 扇门,所有关着的门都是打开的
- 反之,如果 ,则在你到达第 扇门之前,按钮效果就已经结束,导致无法通过某个关着的门
算法步骤
- 初始化 (或一个很大的数,如 ),
- 遍历所有 扇门(索引从 到 ):
- 如果当前门是关着的():
- 更新
- 更新
- 如果当前门是关着的():
- 判断:如果 ,输出
"YES",否则输出"NO"
时间复杂度
- 每个测试用例:
- 总时间复杂度:
空间复杂度
示例验证
示例 1
,状态:
- 区间长度 =
- →
"YES"✓
示例 2
,状态:
- 区间长度 =
- →
"NO"✓
示例 3
,状态:
- 区间长度 =
- →
"YES"✓
示例 4
,状态:
- 区间长度 =
- →
"YES"✓
示例 5
,状态:
- 区间长度 =
- →
"NO"✓
-
- 1
信息
- ID
- 7284
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 1
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者