zoukankan      html  css  js  c++  java
  • POJ

    Radar Installation
    Time Limit: 1000MS   Memory Limit: 10000K
    Total Submissions: 96177   Accepted: 21378

    Description

    Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the other. Each small island is a point locating in the sea side. And any radar installation, locating on the coasting, can only cover d distance, so an island in the sea can be covered by a radius installation, if the distance between them is at most d.

    We use Cartesian coordinate system, defining the coasting is the x-axis. The sea side is above x-axis, and the land side below. Given the position of each island in the sea, and given the distance of the coverage of the radar installation, your task is to write a program to find the minimal number of radar installations to cover all the islands. Note that the position of an island is represented by its x-y coordinates.

    Figure A Sample Input of Radar Installations


    Input

    The input consists of several test cases. The first line of each case contains two integers n (1<=n<=1000) and d, where n is the number of islands in the sea and d is the distance of coverage of the radar installation. This is followed by n lines each containing two integers representing the coordinate of the position of each island. Then a blank line follows to separate the cases.

    The input is terminated by a line containing pair of zeros

    Output

    For each test case output one line consisting of the test case number followed by the minimal number of radar installations needed. "-1" installation means no solution for that case.

    Sample Input

    3 2
    1 2
    -3 1
    2 1
    
    1 2
    0 2
    
    0 0
    

    Sample Output

    Case 1: 2
    Case 2: 1
    

    Source

    可将点的坐标转为在x轴上对应的位置,然后根据右端对应的值进行排序判断。

    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    struct pos
    {
    	double left,right;
    };
    bool flag;
    bool compare(pos a, pos b)
    {
    	return a.right < b.right;
    }
    int main()
    {
    	int n;
    	double d;
    	int m = 1;
    	pos a[1005];
    	while (~scanf("%d %lf", &n, &d))
    	{
    		if (!n || !d)
    		{
    			break;
    		}
    		int sum = 1;
    		flag = true;
    		double x, y;
    		for (int i = 0; i<n; i++)
    		{
    			scanf("%lf %lf", &x, &y);
    			if (!flag)
    			{
    				continue;
    			}
    			if (y > d)
    			{
    				flag = false;
    				continue;
    			}
    			a[i].left = x - sqrt(d*d - y*y);
    			a[i].right = x + sqrt(d*d - y*y);
    		}
    		
    		if (!flag)
    		{
    			printf("Case %d: -1
    ",m);
    			m++;
    			continue;
    		}
    		sort(a, a + n,compare);
    		double temp = a[0].right;
    		for (int i = 1; i < n; i++)
    		{
    			if (temp<a[i].left)
    			{
    				sum++;
    				temp = a[i].right;
    			}
    		}
    		printf("Case %d: %d
    ", m,sum);
    		m++;
    	}
    	return 0;
    }





  • 相关阅读:
    C++ map详解
    C++ vector和list的区别
    C++静态存储,动态存储
    C++文件输入和输出
    C/C++数组名与指针的区别详解
    C++运算符重载详解
    poj3177Redundant Paths tarjan缩点
    C++编译过程与内存空间
    [JAVA &#183; 0基础]:19.容器类
    FFmpeg总结(六)AV系列结构体之AVPacket
  • 原文地址:https://www.cnblogs.com/csu-lmw/p/9124481.html
Copyright © 2011-2022 走看看