• Gym324843D


    Gym324843D

    交互,构造。

    题意:

    在106 * 106的平面中,存在n个点。

    你每次询问(x,y) 系统会高呼你一个D,为(x,y)到最近的点的距离的平方。

    每当你找到一个点的准确位置以后,当你继续查找时,系统不会再考虑这个点了。

    解:

    1.随便查询一个点(x,y),得到一个d

    2.继续查询以(x,y)为原心,sqrt(d)为半径的圆的上下左右四个点。

    3.在这个四个点中选用查询所得D最小的点,重复至第一步

    循环这个过程,D不断减小。

    #include <bits/stdc++.h>
    using namespace std;
    const long long N = 1000010;
    void in(long long &x){
        x=0;char c=getchar();
        long long y=1;
        while(c<'0'||c>'9'){if(c=='-')y=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+c-'0';c=getchar();}
        x*=y;
    }
    
    void o(long long x){
        if(x<0){x=-x;putchar('-');}
        if(x>9)o(x/10);
        putchar(x%10+'0');
    }
    long long n;
    bool flag;// flag == true == 出现0 == 找到了点
    long long qur(long long x,long long y){//询问一次
        x=max(x,(long long)0);x=min((long long)1000000,x);//处理x边界
        y=max(y,(long long)0);y=min((long long)1000000,y);//处理y边界
        o(x);putchar(' ');o(y);cout<<endl;//查询
        long long res;in(res);
        if(res==0)flag=true;//找到了!
        return res;返回
    }
    long long a[N];
    map<long long,long long>mp;
    long long dx[10];
    long long dy[10];
    long long dis[10];
    void Q(){
        long long x=0,y=0;
        long long d = qur(x,y);if(flag)return;
        while(d!=0){//找圆上四个的
            long long dd = sqrt(d);
            dx[1]=-dd;dx[2]=dd;dx[3]=0;dx[4]=0;
            dy[1]=0;dy[2]=0;dy[3]=-dd;dy[4]=dd;
            for(long long i=1;i<=4;i++){
                dis[i]=qur(x+dx[i],y+dy[i]);if(flag)return;//查找并记录四个点的回复
            }
            //找到最后小的一个点
            long long mindd=dis[1];
            for(long long i=1;i<=4;i++){
                mindd=min(mindd,dis[i]);
            }
            //若没找到,重制(x,y),继续循环。
            for(long long i=1;i<=4;i++){
                if(mindd==dis[i]){
                    x+=dx[i];y+=dy[i];
                    x=max(x,(long long)0);x=min((long long)1000000,x);
                    y=max(y,(long long)0);y=min((long long)1000000,y);
                    break;
                }
            }
            d=mindd;
        }
    }
    signed main(){
        in(n);//读入
        while(n--){
            flag=false;//重制
            Q();//
        }
        return 0;
    }
    
  • 相关阅读:
    一个apache安装后无法启动的原因分析
    数字的一点考虑
    [转]bat方式上删除注册表键,项
    题解 P2016 【战略游戏】
    题解 P1403 【[AHOI2005]约数研究】
    题解 P1317 【低洼地】
    2020面向对象程序设计寒假作业3 设计思想
    题解 P1829 【[国家集训队]Crash的数字表格 / JZPTAB】
    题解 P1082 【同余方程】
    Unity3D读取外部Text
  • 原文地址:https://www.cnblogs.com/yesuweiYYYY/p/14672057.html
Copyright © 2020-2023  润新知