zoukankan      html  css  js  c++  java
  • POJ 1328 Radar Installation(经典贪婪)

    Radar Installation
    Time Limit: 1000MS   Memory Limit: 10000K
    Total Submissions: 54143   Accepted: 12178

    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

    算法分析:

    刚開始不知道从哪分析,后经指点发现圆心位置是个突破口。首先得出每个点所相应的圆心位置,注意若想覆盖最多。每个圆都尽量做到使点刚好位于圆边界。比方我们左右两边各有一个水果。我们不确定是否能拿得到两个,为了使得尽量拿到两个,我们会使左手刚好触碰到一个。伸右手去抓还有一个,而不是直接以某一个为中心而忽略增大自身所能更加接近还有一个的机会,于是问题就变成了求解圆心。依照圆心排序,不断更新雷达圆心,终于使数量最小

    此外,注意代码凝视部分。。

    圆心竖轴为0,横轴坐标计算公式:

    r=x+sqrt(d*d-y*y)//圆心从左向右移动

    #include<iostream>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    
    typedef struct island{
    	int x;
    	int y;
    	double z;
    }island;
    island land[1000];
    int Comp(island a,island b)
    {
    	return a.z<b.z;
    }
    int main()
    {
    	int n,d,i,count,num=1,sign;
    	while(cin>>n>>d)
    	{
    		sign=0;
    		if(!(n||d))
    			break;
    		count=1,i=0;
    		while(i<n)
    		{
    			cin>>land[i].x>>land[i].y;
    			land[i].z=(double)land[i].x+sqrt(double(d*d-land[i].y*land[i].y));  //圆心必须浮点数啊有木有
    			if(abs(land[i].y)>d||d<=0)                                         //注意。当雷达无法笼罩时的情况输出-1
    			sign=1;
    			i++;
    		}
    		if(sign)
    		{cout<<"Case "<<num<<": -1"<<endl;num++;continue;}
    		sort(land,land+n,Comp); //对圆心位置从左到右进行排序
    		i=1;
    		double a=land[0].z;
    		while(i<n)
    		{
    			if(!((land[i].x-a)*(land[i].x-a)+land[i].y*land[i].y<=d*d))
    			{
    				a=land[i].z;
    				count++;
    			}
    			i++;
    		}
    		cout<<"Case "<<num<<": "<<count<<endl;
    		num++;
    	}
    	return 0;
    }


    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    三数之和
    罗马数字与整数
    Oracle 开启或关闭归档
    Oracle RMAN scripts to delete archivelog
    Oracle check TBS usage
    Oracle kill locked sessions
    场景9 深入RAC运行原理
    场景7 Data Guard
    场景4 Data Warehouse Management 数据仓库
    场景5 Performance Management
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4792770.html
Copyright © 2011-2022 走看看