码迷,mamicode.com
首页 > 其他好文 > 详细

Google Code Jam 2020 Round1B Blindfolded Bullseye

时间:2020-04-20 09:14:12      阅读:79      评论:0      收藏:0      [点我收藏+]

标签:方法   间隔   就是   line   假设   math   幸好   交互   amp   

总结

这一题是道交互题,平时写的不多,没啥调试经验,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个点落在圆内。

由此,问题解决。

Google Code Jam 2020 Round1B Blindfolded Bullseye

标签:方法   间隔   就是   line   假设   math   幸好   交互   amp   

原文地址:https://www.cnblogs.com/zengzk/p/12735539.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!