zoukankan      html  css  js  c++  java
  • 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 ight])中至少有1个点落在圆内。

    由此,问题解决。

  • 相关阅读:
    安卓开发_浅谈TimePicker(时间选择器)
    eclipse显示代码行数
    Java数据解析---JSON
    Java数据解析---PULL
    Java数据解析---SAX
    统计机器学习(目录)
    FP Tree算法原理总结
    梯度下降(Gradient Descent)小结
    用scikit-learn和pandas学习线性回归
    用scikit-learn学习BIRCH聚类
  • 原文地址:https://www.cnblogs.com/zengzk/p/12735539.html
Copyright © 2011-2022 走看看