Google Code Jam 2020 Round1B Blindfolded Bullseye

總結

這一題是道交互題,平時寫的很少,沒啥調試經驗,GYM上遇到了少說交個十幾發。一開始很快的想出了恰爛分的方法,可是沒有着急寫,果真很快就又把Test Set3的方法想到了,可是想到歸想到,調了快一個多小時調不出來,一直拖到告終尾才調好,而後一個常量忘記初始化致使第三個點還RE了,幸虧憑着爛分仍是苟進下一輪了。spa

題意

在一個\(2e9 * 2e9\)的平面中,有一個圓,圓的圓心位於整數點,圓的半徑\(R\)是整數且\(10^9/2 \leq R \leq 10^9\)。你每次能夠詢問一個點,判題器會返回這個點是不是圓心,是否在圓上。用至多300次詢問肯定圓心。調試

解題思路

Test Set1

\(S = \{(i,j), i,j \in [-5, 5]\}\),圓心一定屬於\(S\),枚舉就能夠了。class

Test set 2 & 3

首先若是咱們找到了圓內的一點,咱們就能夠用4次二分找到和這個點同行或同列的邊界點,即找到了圓的兩條「弦」。這裏的「弦」並非嚴格意義上的弦,可是擁有相似的性質,好比能夠用兩條"弦"肯定圓心,這裏爲了方便就借過來用用。test

假設圓內一點爲\((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個點落在圓內。方法

由此,問題解決。經驗

相關文章
相關標籤/搜索