【EOJ Monthly 2019.02 - A】回收卫星(交互题型,二分)
題干:
單測(cè)試點(diǎn)時(shí)限: 1.0 秒
內(nèi)存限制: 256 MB
“這個(gè)世上沒(méi)有無(wú)用的齒輪,也只有齒輪本身能決定自己的用途。”
就像太空中的衛(wèi)星,雖然不計(jì)其數(shù),但都各司其職。
但沒(méi)有一個(gè)東西是能夠永遠(yuǎn)無(wú)損的。為了便于回收及修理,衛(wèi)星在故障后會(huì)生成一個(gè)球形的星場(chǎng),與之配對(duì)的感應(yīng)器能判斷其是否在星場(chǎng)內(nèi)。
QQ 小方現(xiàn)在要負(fù)責(zé)衛(wèi)星的回收工作,他負(fù)責(zé)使用這些感應(yīng)器鎖定衛(wèi)星的位置。QQ 小方有衛(wèi)星基本的運(yùn)動(dòng)信息,因此每次工作時(shí),他都能保證自己與衛(wèi)星保持相對(duì)靜止,以及自己在星場(chǎng)內(nèi)。因此,可以將 QQ 小方看作空間直角坐標(biāo)系的原點(diǎn) (0,0,0) ,而星場(chǎng)是一個(gè)中心坐標(biāo)為 (x,y,z) (?109≤x,y,z≤109 ) ,半徑為 r (1≤r≤109 ) 且包含原點(diǎn)的球,其中 x,y,z,r 都是整數(shù)。但接下來(lái),QQ 小方需要你的幫助。
為了回收衛(wèi)星,QQ 小方每次能向一個(gè)整點(diǎn)發(fā)射一個(gè)感應(yīng)器,感應(yīng)器會(huì)返回它是否在星場(chǎng)里。由于經(jīng)費(fèi)緊張,QQ 小方只能發(fā)射不超過(guò) 200 個(gè)感應(yīng)器,你能幫助他找到衛(wèi)星的具體坐標(biāo) (x,y,z) 嗎?
星場(chǎng)邊界上的點(diǎn)視為在星場(chǎng)內(nèi)部。
交互流程
每一行輸出四個(gè)整數(shù) 0,xi,yi,zi ,代表向 (xi,yi,zi ) 發(fā)射一個(gè)感應(yīng)器。隨后,交互程序會(huì)輸出 1 / 0 ,代表感應(yīng)器在 / 不在星場(chǎng)內(nèi)。
收集足夠多的數(shù)據(jù)之后,輸出四個(gè)整數(shù) 1,x,y,z ,代表確定衛(wèi)星的坐標(biāo)是 (x,y,z) 。之后,你的程序不應(yīng)再有任何輸出。
樣例
Input
0 0 0 0 0 0Output
0 2 0 0 0 -2 0 0 0 0 2 0 0 0 -2 0 0 0 0 2 0 0 0 -2 1 0 0 0提示
對(duì)于樣例:
球場(chǎng)的中心是 (0,0,0 ),半徑為 1 。
在交互過(guò)程中,依次訪問(wèn)了 (2,0,0 ), (?2,0,0 ), (0,2,0 ), (0,?2,0 ), (0,0,2 ), (0,0,?2 ) 六個(gè)點(diǎn),但這六個(gè)點(diǎn)都不在球場(chǎng)內(nèi)。因?yàn)樵c(diǎn)在球場(chǎng)內(nèi),所以球場(chǎng)中心一定位于 (0,0,0 ),半徑為1 。(當(dāng)然,也有可能是運(yùn)氣好,但這個(gè)球的中心的確是(0,0,0 ) 。)
解題報(bào)告:
? ?因?yàn)轭}目中說(shuō)了原點(diǎn)一定是其中的點(diǎn),所以我們直接分成三個(gè)坐標(biāo)軸上(也就是求x的時(shí)候其他兩個(gè)坐標(biāo)都是0),分別二分求中點(diǎn),最后結(jié)果一定就是答案了。
以 x 軸為例,因?yàn)樵c(diǎn)在球內(nèi),球面和 x 軸的正負(fù)半軸(含原點(diǎn))一定各有一個(gè)交點(diǎn)。如果兩個(gè)交點(diǎn)分別為 (x1,0,0 ) 和 (x2,0,0 ),則球心一定在這兩點(diǎn)所成線段的垂直平分面上。因?yàn)榫€段在 x 軸上,所以所得到平面的表達(dá)式是 x=x1+x22 ,相當(dāng)于確定了球心在 x 軸上的坐標(biāo)。
因此,只要求出兩個(gè)交點(diǎn)的中點(diǎn)坐標(biāo)即可。交點(diǎn)坐標(biāo)可能含有小數(shù),但是依舊可以通過(guò)二分法求出半軸上第一個(gè)不在球內(nèi),或最后一個(gè)在球內(nèi)的點(diǎn)的坐標(biāo)。對(duì)正負(fù)半軸各求一次,根據(jù)對(duì)稱性,所得兩點(diǎn)的中點(diǎn)坐標(biāo)應(yīng)該與真實(shí)交點(diǎn)中點(diǎn)坐標(biāo)相同,因此可以在約 2×30=60 次操作內(nèi)確定球心在 x 軸上的坐標(biāo)。(因?yàn)轭}干中說(shuō)了最終答案為整數(shù))
同樣地,可以用此方法求出球心在 y 軸,z 軸上的坐標(biāo),得解。
有一個(gè)常見(jiàn)錯(cuò)誤是:二分交點(diǎn)從 109 開(kāi)始。雖然 x,y,z,r≤109 ,但交點(diǎn)坐標(biāo)絕對(duì)值可以大于 109 , 值 ≤2×109 。同時(shí),此時(shí)的 l+r2 會(huì)在 l+r 時(shí)爆 int。
還有就是注意交互題型,如果要scanf讀入的話一定不要忘了printf后面加fflush(stdout)。。
AC代碼:
#include<bits/stdc++.h> #define ll long long using namespace std; const ll INF=2e9; ll a[5]; void ask(int tp,int m) {for(int i=1; i<=3; i++)a[i]=0;a[tp]=m;printf("0 %lld %lld %lld\n",a[1],a[2],a[3]);fflush(stdout); } ll go(int tp) {ll l=0,r=INF,mid,ans1=0,ans2=0;int op;while(l<=r) {mid=l+(r-l)/2;ask(tp,mid);scanf("%d",&op);if(op)l=mid + 1,ans1 = mid;else r=mid - 1;}l=-INF,r=0;while(l<=r) {mid=l+(r-l)/2;ask(tp,mid);scanf("%d",&op);if(op)r=mid-1,ans2 = mid;else l=mid+1;}return (ans1+ans2)/2; } int main() {ll x,y,z;x=go(1);y=go(2);z=go(3);printf("1 %lld %lld %lld\n",x,y,z);return 0 ; }?
總結(jié)
以上是生活随笔為你收集整理的【EOJ Monthly 2019.02 - A】回收卫星(交互题型,二分)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 信用卡申请以卡办卡 获批高额度不是问题
- 下一篇: 【LightOJ - 1027】A Da