Educational Codeforces Round 158 (Rated for Div. 2)
内容提要
A. 线路旅行:给定一辆车、一个目的地和沿途的几个加油站,基于连续加油站距离之间的最大差异计算所需的最小油箱容量。B. 芯片和带子:给定一个指向某个值的指针的数组,基于将每个递减子序列减少到与其前一个元素相同的值的成本,计算使所有值相等所需的最小转移次数。C. 加、除和取整:给定一个数组,基于数组中最小和最大元素的值,计算使所有值相等所需的最小操作次数。D. 又一个怪物战斗:给定一组怪物和选择一个初始怪物进行攻击的能力,基于在每个怪物之前需要击败的最大怪物数量,计算击败所有怪物所需的最小初始攻击力。
延伸解读
题目A的油箱容量计算逻辑
本题要求计算往返旅行所需的最小油箱容量。关键点在于返程的最后一段是两倍距离,因为需要从最后一个加油站返回目的地再回到该加油站。因此,油箱容量必须至少满足:第一个加油站的距离、最后一个加油站到目的地的两倍距离,以及任意两个连续加油站之间的最大距离。代码通过取这些值的最大值得到答案。
题目B的传送次数与递减子序列
题目B中,数组初始全0,第一个元素为1,指针初始指向第一个元素。每次移动必须将指针移到下一个位置或传送到任意位置,并将目标位置的值加1。目标是通过最小传送次数使数组达到给定值。思路指出,对于每个递减子序列,只需考虑第一个元素的代价,该代价与前一个元素相关,因为只需减少到与前一个值相同。最终传送次数为第一个元素值减1加上所有递增处的差值。
题目C的操作策略与奇偶性
题目C允许每次操作将所有元素加上任选x后向下取整除以2,目标使所有元素相等。由于操作对所有元素一致,只需关注最小值和最大值。分析表明,x应尽可能小以快速缩小差值。当最小值是奇数且最大值是偶数时,取x=1可有效降低差值;其他情况取x=0。代码通过循环模拟此过程,直到最小值和最大值相等,并记录操作序列。
题目D的连锁伤害与初始攻击力
题目D中,怪物被攻击后伤害会连锁到相邻未受伤害的怪物,顺序随机,伤害逐步递减。对于每个怪物,其最晚承受伤害的时间取决于初始攻击位置在其左侧还是右侧,因此需要的初始伤害为其生命值加上左侧或右侧怪物数量的较大者。通过枚举所有可能的初始怪物,并计算左右两侧所需的最大初始伤害,再与当前怪物生命值取最大,即可得到全局最小初始攻击力。
Q&A
Codeforces Round 158 的 A 题 Line Trip 要求计算什么?
计算完成往返旅行所需的最小油箱容量。给定目的地距离和沿途加油站位置,油箱容量需满足任意两个连续加油站之间(包括起点到第一个加油站、最后一个加油站到目的地并返回)的最大距离。
B 题 Chip and Ribbon 中,传送次数是如何计算的?
传送次数等于数组第一个元素减一,加上所有递增位置(即当前元素大于前一个元素)的差值之和。因为每次只能移动到下一个值或传送,对于递减子串,只需将值减少到与前一个相同即可,代价由第一个值决定。
C 题 Add, Divide and Floor 每次操作可以做什么?最少操作次数如何求?
每次操作可以选择一个整数 x,将所有元素加上 x 后向下取整除以 2。最少操作次数通过只考虑数组的最小值和最大值来模拟:当最小值是奇数且最大值是偶数时,选择 x=1;否则选择 x=0。重复直到最小值和最大值相等,操作次数即为所需。
D 题 Yet Another Monster Fight 中,如何确定最小的初始攻击力?
枚举所有可能的初始攻击怪物,对于每个怪物,计算其左边所有怪物所需的最大初始伤害(自身生命值加左边怪物数量)和右边所有怪物所需的最大初始伤害(自身生命值加右边怪物数量),然后取这些值与当前怪物生命值的最大值。所有枚举中的最小值即为答案。
A 题中,为什么油箱容量要考虑 2*(x - 最后一个加油站位置)?
因为旅行需要到达目的地后返回,从最后一个加油站到目的地再返回最后一个加油站是两倍的距离,所以油箱容量必须至少能支持这段往返路程。
B 题中,为什么对于递减子串只需要考虑第一个值的代价?
因为每次移动只能到下一个值或传送,对于递减子串,可以通过连续移动到下一个值来减少数值,直到与前一个值相同,这个过程不需要传送。因此递减子串的代价仅取决于第一个值与前一个值的差值,后续递减部分无需额外传送。