Codeforces[CF1036B]Diagonal Walking v.2题解

发布时间 2023-06-29 08:54:35作者: alloverzyt

题目大意

很明显,这道题就是求 k 步之内到达点 \((a,b)\) ,然后尽量走对角线,求能走对角线的最大值。

做题思路

首先明白一个事实,即一个对角线可以通过增加一步而抵达点不变,如图:
image

我们可以这样思考这道题,在到达目的地以后,剩余步数如果为双数,则在对角线来回走,最后会到目的地。但如果剩余步数为单数,我们通过上图转化最后依旧到达目的地。

现在考虑什么时候输出-1,即为走完k步后仍无法到达目的地,考虑从原点到达目的地需要的最小步数即为 \(max(a,b)\)

所以排除掉无法到达的情况,我们分类讨论:

  1. 设 a 和 b 中,a 为较大的一个数,如果 (a-b)%2==0 ,那么走对角线我们会先到达 b 的限定高度,考虑优化走到 a 的路线,以 \((5,3)\) 为例,走到3的限定高度后,如果剩余路线为双数,考虑上下跳走,答案 \(k\) 。:
    image

  2. 依旧设 a 为较大的一数,如果(a-b)%2==1 ,那么我们只好消耗一格走平路以到达目的地,答案 \(k-1\)