总结
这一题是道交互题,平时写的不多,没啥调试经验,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 ight])中至少有1个点落在圆内。
由此,问题解决。