Google Code Jam 2020 Round1B Blindfolded Bullseye

总结

这一题是道交互题,平时写的不多,没啥调试经验,GYM上遇到了少说交个十几发。一开始很快的想出了恰烂分的方法,但是没有着急写,果然很快就又把Test Set3的方法想到了,但是想到归想到,调了快一个多小时调不出来,一直拖到了结尾才调好,然后一个常量忘记初始化导致第三个点还RE了,幸好凭着烂分还是苟进下一轮了。

题意

在一个\(2e9 * 2e9\)的平面中,有一个圆,圆的圆心位于整数点,圆的半径\(R\)是整数且\(10^9/2 \leq R \leq 10^9\)。你每次可以询问一个点,判题器会返回这个点是否是圆心,是否在圆上。用至多300次询问确定圆心。

解题思路

Test Set1

\(S = \{<i,j>, i,j \in [-5, 5]\}\),圆心必定属于\(S\),枚举就可以了。

Test set 2 & 3

首先如果我们找到了圆内的一点,我们就可以用4次二分找到和这个点同行或同列的边界点,即找到了圆的两条“弦”。这里的“弦”并不是数学上的那个弦,但是拥有类似的性质,比如可以用两条"弦"确定圆心,这里为了方便就借过来用用。

假设圆内一点为\((x,y)\),同行的边界点是\((x,y_1)\)\((x,y_2)\),同列的边界点是\((x_1,y)\)\((x_2,y)\),那么圆的圆心为\((\frac{x_1+x_2}{2},\frac{y_1+y_2}{2})\)

现在就只需要解决找圆内一点的问题了。有两个方法,一个就是直接随机取点,很容易可以得到点落在圆内的概率是\(\frac{\pi}{16}\),这样随机取点期望的次数也不大。还有就是以\(D= 10^9/4\)为间隔的搜索,很容易可以得出\((i*D, j*D),i,j \in \left[-3, 3\right]\)中至少有1个点落在圆内。

由此,问题就解决了。

猜你喜欢

转载自www.cnblogs.com/zengzk/p/12735539.html