「每日一题-10.20」cf 1063C

题目链接:https://codeforces.com/problemset/problem/1063/C

第一次做交互......交互,顾名思义就是与电脑互动。并不是在开始时就读入所有数据,而是在程序中进行读入与输出。

题意大概就是在一个二维平面上,告诉你点数,点分黑白两种。你需要在电脑告诉你每个点的颜色之前,定好这个点的位置(依次)。

并在最后,需要做出一根划分黑白阵营的直线。

重点在于在得知颜色之前需要定好坐标。由于是自己决定坐标,所以可以把所有点放在一维上,这里就假设点都在直线x=1上。

黑白点肯定要分在一根线的两端,这样一来,就想到了二分。

假设第一个预测的点是黑色的,那就把直线的较下端作为黑色阵营。要是当前点与第一个点颜色相同,那么就让L变成mid,否则就让R变成mid。

每次需要更新mid,这样的过程可以看成黑白两方阵营互相攻击,并且尽可能地扩大自己的领地。这样就会显得简单一些。

最后,需要给出一条直线上的两个坐标。由于L和R是越缩越接近,所以给出(0,L) (1,R)即可。

扫描二维码关注公众号,回复: 3649452 查看本文章

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 } 

猜你喜欢

转载自www.cnblogs.com/moerblack/p/9823366.html