1 条题解
-
0
D. 猫头鹰塞拉芬 详细题解
题目核心理解
一开始有 个人排队,Kirill 站在第 位(队尾)。 他可以多次向前插队,规则如下:
- 若当前在位置 ,可以跳到任意前面位置 ;
- 要给 位置的人支付 ;
- 对中间每一个人 ,支付 ;
- 要求最终停在前 个位置(); 求最少花费金币数。
核心思路
1. 关键贪心观察
对于任意一个人 :
- 如果 :只给他付 是不划算的,应该尽量直接交换到这里,只付 ;
- 如果 :经过他时付 更便宜,没必要专门交换。
所以最优策略是:
- 只在满足 且 的位置交换;
- 这些位置能跳就跳,能最大程度省钱;
- 跳到不能再跳时,直接枚举前 个位置取最小花费。
2. 花费计算
从 跳到 的花费为:
用前缀和可以 求出区间 的和。
3. 最终收尾
当前方没有满足 且 的位置时:
- 直接枚举 所有位置;
- 计算停在每个位置的总花费;
- 取最小值即为答案。
算法流程
- 预处理 数组的前缀和 ;
- 从队尾 开始向前贪心跳跃;
- 每次寻找第一个 ,满足 且 ;
- 若找到,计算跳跃花费并更新最小值,将 设为 ;
- 若找不到,退出贪心阶段;
- 从当前位置向前遍历到 ,累加 ,并对所有 更新最小花费;
- 输出最小花费。
公式与复杂度分析
单次跳跃花费:
遍历过程总花费递推:
对 用 更新答案。
复杂度
- 前缀和预处理:
- 贪心跳跃:每个位置至多访问一次
- 最后遍历:
总时间复杂度:。 可轻松处理 、多组数据总长度不超过 的范围。
- 1
信息
- ID
- 6532
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者