[hihoCoder] #1307 : 穿越禁区 解题报告

原创 2016年05月30日 12:05:47

题目链接: http://hihocoder.com/problemset/problem/1307

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

作为H国的精英特工,你接到了一项任务,驾驶一辆吉普穿越布满监测雷达的禁区。为了简化题目,我们可以把禁区想象为一个左下角是(0, 0)右上角是( WH )的长方形区域。区域中一共有 N 座雷达,其中第 i 座的坐标是(Xi,Yi ),监测范围是半径为 Ri 的圆形区域。所有在圆内和圆上的运载工具都会被监测到。

你的目标是从左到右穿越禁区。你可以选择线段(0, 0)-(0, H)上任意一点作为起点,线段(W, 0)-(WH)上任意一点作为终点。在禁区内你可以沿任意路线行驶,只要保持始终在禁区内并且没有被雷达监测到。

给出禁区内的雷达部署方案,你需要判断是否存在满足条件的行驶路线。

输入

输入包含多组数据。

第1行是一个整数 T,表示以下有 T 组数据 (1 ≤ T ≤ 10)。

每组数据的第1行:三个整数 WHN (0 ≤ WH ≤ 1000000, 1 ≤ N ≤ 1000)。

每组数据的第2-N+1行:每行三个整数XiYiRi (0 ≤ Xi ≤ W, 0 ≤ Yi ≤ H, 1 ≤ Ri ≤ 1000000)。

输出

对于每组数据输出"YES"或者"NO"表示是否有满足条件的行驶路线。

样例输入
2
10 4 2
5 1 1
5 3 1
10 4 2
5 1 1
6 3 1
样例输出
NO
YES

思路: 这道是并查集的题目, 有好多个雷达, 我们要把能够连在一起的雷达合并起来, 看其总共是否能够覆盖从上到下. 先给每个雷达默认父结点是本身, 然后依次遍历每个雷达, 如果A雷达和B雷达能够接触到, 即他们圆心距离小于两个半径之和, 说明他们在一个集合里面, 就把B的最深父结点设置为A的最深父结点. 这样做完之后, 再依次将每个雷达的父结点设为本身的最深父结点, 就可以知道总共有几个集合, 然后计算每个集合所覆盖的范围是多少即可.

代码如下

/*************************************************************************
	> File Name: task.cpp
	> Author: Maoting Ren
	> Mail: mren@g.clemson.edu
	> Created Time: Sun 22 May 2016 03:37:33 AM EDT
 ************************************************************************/

#include<iostream>
#include<vector>
#include<algorithm>
#include<limits.h>
#include<set>
#include<math.h>
using namespace std;

int main()
{
    vector<pair<int ,int> > vec;
    int T, W, H, N, xi, yi, ri;
    cin >> T;
    while(T--)
    {
        cin >> W >> H >> N;
        vector<vector<int> > radars;
        for(int i = 0; i < N; i++)
        {
            cin >> xi >> yi >> ri;
            radars.push_back(vector<int>{xi, yi, ri});
        }
        int ans = 1;
        vector<int> hash(N);
        for(int i = 0; i < N ;i++) hash[i] = i; 
        for(int i =0; i< N; i++)
        {
            int x1 = radars[i][0], y1 = radars[i][1], r1 = radars[i][2];
            for(int j = i+1; j < N; j++)
            {
                int x2 = radars[j][0], y2 = radars[j][1], r2 = radars[j][2];
                float dis = sqrt(pow(x1-x2, 2)+ pow(y1-y2, 2));
                if(dis <= r1+r2)
                {
                    int par1 = hash[j], par2 = hash[i];
                    while(hash[par1] != par1) par1 = hash[par1]; 
                    while(hash[par2] != par2) par2 = hash[par2];
                    hash[par1] = par2;
                }
            }
        } 
        set<int> parent;
        for(int i =0; i< N; i++)
        {
            int par = hash[i];
            while(par != hash[par]) par = hash[par];
            hash[i] = par;
            parent.insert(par);
        }

        for(int val: parent)
        {
            int top = INT_MIN, bot = INT_MAX;
            for(int i = 0; i < N; i++)
            {
                if(hash[i] == val)
                {
                    top = max(top, radars[i][1] + radars[i][2]); 
                    bot = min(bot, radars[i][1] - radars[i][2]);
                    if(top >= H && bot <=0)
                    {
                        ans = 0;
                        i = N;
                        break;
                    }
                }    
            }
            if(ans == 0) break;
        }

        if(ans) cout << "YES" << endl;
        else cout << "NO" << endl;
    }
    return 0;
}






版权声明:本文为博主原创文章,未经博主允许不得转载。

hihoCoder— 穿越禁区(并查集)

题目链接:传送门 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 作为H国的精英特工,你接到了一项任务,驾驶一辆吉普穿越布满监测...
  • jiangzhiyuan123
  • jiangzhiyuan123
  • 2017年06月11日 21:17
  • 93

hihoCoder1307 : 穿越禁区

计算几何+并查集
  • FSAHFGSADHSAKNDAS
  • FSAHFGSADHSAKNDAS
  • 2017年05月08日 15:43
  • 196

Ride to office

MZone中除了Weiwei的人都以固定的速度骑自行车到办公室,Weiwei则总是跟着别人。Weiwei在0时刻到达MZone的大门,他会寻找一个人跟随。如果有人在0时刻出发,他就会跟随那个人,否则他...
  • linylin
  • linylin
  • 2017年08月07日 08:52
  • 70

FOJ--1076--穿越沙漠--解题报告

一辆吉普车来到x公里宽的沙漠边沿A点,吉普车的耗油量为1升/公里,总装油量为500升。通常,吉普车必须用自身油箱中的油在沙漠中设置若干个临时储油点,才能穿越沙漠的。假设在沙漠边沿A点有充足的汽油可供使...
  • xiaotaoqibao
  • xiaotaoqibao
  • 2009年08月01日 19:38
  • 1271

SetNamedSecurityInfo 1307 错误

SetNamedSecurityInfo  1307 错误 SetFileSecurity (returns 1307) SetSecurityInfo (returns 1307) S...
  • lif12345
  • lif12345
  • 2015年08月10日 17:57
  • 604

UESTC-1307-windy数

windy定义了一种windy数。 不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,在A和B之间,包括A和B,总共有多少个windy数? Input ...
  • mowayao
  • mowayao
  • 2014年05月16日 12:46
  • 837

hihocoder#1039 : 字符消除

自己写的,实例没错,但是提交WA#include #include using namespace std;string str_remain(string str){ string::ite...
  • gao1440156051
  • gao1440156051
  • 2015年09月24日 21:47
  • 726

【hihocoder】1014. Trie树

hihocoder, trie树
  • zone_programming
  • zone_programming
  • 2015年09月25日 16:31
  • 1139

NAT 原理与NAT穿越

NAT的简介和原理 简介 NAT即Network Address Translation,它可以让那些使用私有地址的内部网络连接到Internet或其它IP网络上.NAT路由在将内部网络的数据...
  • whoamiyang
  • whoamiyang
  • 2016年07月22日 15:46
  • 3208

[hihocoder1039]字符消除

问题简介 具体参照hihocoder网站。 实现思路 因为字符串长度最大为100,只有ABC三个字符,所以只有300种情况,每种情况最差处理是O(100^2)。所以即便最差情况也只有3e6的计算...
  • silent56_th
  • silent56_th
  • 2016年12月02日 15:12
  • 313
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[hihoCoder] #1307 : 穿越禁区 解题报告
举报原因:
原因补充:

(最多只允许输入30个字)