1. 程式人生 > >「每日一題-10.20」cf 1063C

「每日一題-10.20」cf 1063C

image com 做出 force 並且 劃分 with using 當前

題目鏈接:https://codeforces.com/problemset/problem/1063/C

第一次做交互......交互,顧名思義就是與電腦互動。並不是在開始時就讀入所有數據,而是在程序中進行讀入與輸出。

題意大概就是在一個二維平面上,告訴你點數,點分黑白兩種。你需要在電腦告訴你每個點的顏色之前,定好這個點的位置(依次)。

並在最後,需要做出一根劃分黑白陣營的直線。

技術分享圖片

重點在於在得知顏色之前需要定好坐標。由於是自己決定坐標,所以可以把所有點放在一維上,這裏就假設點都在直線x=1上。

黑白點肯定要分在一根線的兩端,這樣一來,就想到了二分。

假設第一個預測的點是黑色的,那就把直線的較下端作為黑色陣營。要是當前點與第一個點顏色相同,那麽就讓L變成mid,否則就讓R變成mid。

每次需要更新mid,這樣的過程可以看成黑白兩方陣營互相攻擊,並且盡可能地擴大自己的領地。這樣就會顯得簡單一些。

最後,需要給出一條直線上的兩個坐標。由於L和R是越縮越接近,所以給出(0,L) (1,R)即可。

Code:

 1 #include<iostream>
 2 #include<string>
 3 using namespace std;
 4 int n,x,y,mid,l,r,pre;
 5 string s;
 6 int main(){
 7     ios::sync_with_stdio(false);
 8
cin>>n; 9 r=1e9; 10 for(int i=1;i<=n;++i) { 11 cout<<"1 "<<mid<<endl; 12 cin>>s; 13 if(i==1) pre=s[0]; 14 if(s[0]==pre) l=mid; 15 else r=mid; 16 mid=((long long)l+(long long)r)>>1; 17 } 18
cout<<"0 "<<l<<"2 "<<r<<endl; 19 }

「每日一題-10.20」cf 1063C