D. Circle Game(思维+对称博弈)

https://codeforces.com/problemset/problem/1451/D

 

题意翻译

在坐标轴上,有一个以 (0,0)为圆点,dd 为半径的圆。
现在 Ashish 和 Utkarsh 玩游戏,Ashish 是先手。
在 (0,0) 处有一颗棋子,两人轮流将棋子向上或向右移动 kk 个单位,棋子不能移出圆,谁无法移动谁输。


思路:

两条定理

  1. 必败状态的所有后继状态都是必胜状态

  2. 必胜状态的至少一个后继状态是必败状态

假设(x,y)是必败点,那么(x+1,y),(x,y+1)是必胜点。

根据本题,(x+1,y+1)胜负隔一个k转化,是必败点。再下去可以发现其实必胜点和必败点是连成一条线的。

(https://www.luogu.com.cn/user/59388的图)

【蓝色表示必败点,红色表示必胜点】

D. Circle Game(思维+对称博弈)

D. Circle Game(思维+对称博弈)

那么我们方便的判断直接判y=x这条线。

那么y=x这条怎么知道是在必胜和必败呢?

我们先假设当前y=x是在必胜D. Circle Game(思维+对称博弈)。那么人工模拟一下发现实际上这个y=x的最后一个红色的是先手输的,所以实际上图是反的。

那么获得了y=x是必败点的图。

D. Circle Game(思维+对称博弈)

 基于此,我们刚才说到了最后一个y=x是蓝色点,如果这个圆的半径稍微扩大一点,也就是刚好把最后一个y=x的蓝色点上面一个(对称的右边一个状态是一样的)包括进来,那么A到了y=x的最后一个蓝色,还有上右可以走一步,一走发现这个时候把决策时刻留给了B。因此可以发现如果y=x的最远一个点上面一个点/右边一个点也在圆内,A获胜,否则B获胜。

求的时候就y=x与圆方程联立求得最远点,/k后表示k步实际上能达到的。然后看其旁边一个点是否在圆内。

 

 

上一篇:685. Redundant Connection II (LeetCode 刷题笔记)


下一篇:少儿编程-杨紫鑫