P1747 好奇怪的游戏 思考

· · 个人记录

前言

这是我的解法,没有大佬们的方法那么简洁,但用的是简单的,朴素的方法。

理论

我们先设x_1y_1中大的为a,小的为b

我们可以发现,每次移动,坐标都会\pm1或者\pm2,但要注意一点,没有(\pm1,\pm1)这样的组合

然后就可以找到理论最优:从a开始每一次走2步,直至1。此时步数为\lceil\frac{a-1}{2}\rceil,又因为a是整数,即\lfloor\frac{a}{2}\rfloor步。因为 C++ 会自动向下取整,所以更好算一些。

如果要取这种解法,还需要满足一些条件:

  1. 构成(b-1)的步数必须含有2

特殊点

我们可以发现,首先(1,2)(2,1)(2,2)就得特判。然后,我们 就可以\color{#22AB22}AC 还要找更多的特殊点。

b每加2时,我们可以通过+2,-2来凑数,所以只需找到最小的奇数和偶数步即可。

凑数法:(-1,-1,-1)=>(+1,-2,-2)。故步数超过2时都可以用这种方法避免全是1

当步数为2时,a=45,此时b=3

但由于a=5时由两个2组成,所以可以排除。

(4,3)(3,4)应特判。

如有遗漏,请尽快提出!

注:测试点太水了,只特判三个点确实可以\color{#22AB22}AC