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

题目链接: 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;
}






阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq508618087/article/details/51536912
文章标签: hihoCoder 并查集
个人分类: hihoCoder 并查集
上一篇[hihoCoder] #1306 : 股票价格 解题报告
下一篇[hihoCoder] 任务分配 解题报告
想对作者说点什么? 我来说一句

穹顶穿越插件更新至20180310

2018年03月10日 540KB 下载

穿越机图纸

2017年08月11日 115KB 下载

青春禁区最勇敢和最彻底的作品

2007年08月23日 196KB 下载

ZOJ解题报告ZOJ解题报告

2010年08月02日 282KB 下载

acm解题报告.rar

2009年03月18日 10MB 下载

穿越计算机的迷雾pdf完整版

2015年02月13日 17.35MB 下载

穿越实用技术手册.txt

2009年06月03日 4.17MB 下载

穿越计算机的迷雾》.(李忠).[PDF]

2018年04月16日 32.63MB 下载

没有更多推荐了,返回首页

关闭
关闭