Gym

来源:互联网 发布:mysql官方下载教程 编辑:程序博客网 时间:2024/06/09 15:34

题目链接:https://vjudge.net/problem/Gym-101490G
题意:有n个传感器,每个传感器有三个参数(x,y,d),x,y表示传感器的位置,现在让你建一个观测站,这个观测站需要能检测到所有的传感器,如果传感器能被监测站检测到到的话,一定会满足,传感器到检测站的曼哈顿距离等于d,如果只存在一个满足条件的监测站,就直接输出坐标,如果不存在就输出不确定,如果不存在输出impossible
解析:对于每个传感器来说,满足建站位置只能是一个菱形上的整点,那其实是考虑n个菱形是否能交出一点,理论可行,但是很难写。整个二维平面的大小是1e6*1e6,那么我们不妨考虑枚举一个点的传感器所满足的检测站位置,然后去判断是否满足其他监测站,然后这要搞一下,感觉这个在每个传感器规模很大的时候,这个二维平面限制了他,所以及时break,应该不会超时,第一次忘了写break,结果A了,看来数据有点水

#include <bits/stdc++.h>using namespace std;const int maxn = 1005;struct point{    int x,y,d;}a[maxn];int n,ax,ay;bool judge(int x,int y){    for(int i=1;i<n;i++)    {        if(abs(a[i].x-x)+abs(a[i].y-y)!=a[i].d)            return false;    }    ax = x,ay = y;    return true;}int main(void){    scanf("%d",&n);    for(int i=0;i<n;i++)        scanf("%d %d %d",&a[i].x,&a[i].y,&a[i].d);    int ans = 0;    if(n==1)    {        if(a[0].d)            puts("uncertain");        else            printf("%d %d\n",a[0].x,a[0].y);    }    else    {        for(int i=0;i<=a[0].d;i++)        {            int dy = a[0].d-i;            if(judge(a[0].x+i,a[0].y+dy))                ans++;            if(i&&dy&&judge(a[0].x-i,a[0].y-dy))                ans++;            if(i&&judge(a[0].x-i,a[0].y+dy))                ans++;            if(dy&&judge(a[0].x+i,a[0].y-dy))                ans++;            if(ans>1)                break;        }        if(ans)        {            if(ans==1)                printf("%d %d\n",ax,ay);            else                puts("uncertain");        }        else            puts("impossible");    }    return 0;}
原创粉丝点击