PKU1328 Radar Installation

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zonelight/article/details/3977472

/*Radar Installation

Time Limit: 1000MS Memory Limit: 10000K

Total Submissions: 10128 Accepted: 1990

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

 

Beijing 2002*/

 

#include "iostream"

#include "vector"

#include "math.h"

using namespace std;

 

 

class dot

{

public:

double x;

double y;

double l;

double r;

};

 

void solution(vector<dot> k,double d,int num)

{

int result = 1;

dot tmp;

if(d < 0)

{

result = -1;

cout<<"Case "<<num<<": "<<result<<endl;

return;

}

 

for(vector<dot>::iterator iter = k.begin();iter != k.end();iter++)

{

if((*iter).y > d)

{

result = -1;

cout<<"Case "<<num<<": "<<result<<endl;

return;

}

else

{

double s = sqrt(d * d - (*iter).y * (*iter).y);

(*iter).l = (*iter).x - s;

(*iter).r = (*iter).x + s;

}

}

for(vector<dot>::iterator iter = k.begin();iter != k.end();iter++)

{

for(vector<dot>::iterator iters = iter + 1;iters != k.end();iters++)

{

if((*iter).l > (*iters).l)

{

tmp = (*iter);

(*iter) = (*iters);

(*iters) = tmp;

}

else if((*iter).l == (*iters).l)

{

if((*iter).r > (*iters).r)

{

tmp = (*iter);

(*iter) = (*iters);

(*iters) = tmp;

}

}

 

}

}

double left = (*(k.begin())).l,right = (*(k.begin())).r;

for(vector<dot>::const_iterator iter = k.begin() + 1;iter != k.end();iter++)

{

if((*iter).l > right)

{

result++;

right = (*iter).r;

}

else

{

if((*iter).r < right)

{

right = (*iter).r;

}

}

 

 

}

cout<<"Case "<<num<<": "<<result<<endl;

return;

 

}

 

 

int main(void)

{

int n;

double d;

int num = 1;

while(cin>>n>>d)

{

if(n == 0 || d == 0)

{

break;

}

 

else

{

vector<dot> k;

dot m;

for(int i = 0;i < n;i++)

{

cin>>m.x>>m.y;

k.push_back(m);

}

solution(k,d,num++);

}

 

 

 

}

return 0;

}

 

贪心。。首先来看一种通常的情况。。以岛为圆心距离为半径画圆,圆与X轴相交于2个点,这2个点一左一右就产生了一个区间,实际上仔细思考就能明白X轴上处于这个区间内的点就是以这些点任一个为圆心距离d为半径画圆能够把当前这个岛包括进来的雷达的集合。。。那么一个岛的区间和另一个岛的区间若有重合区域。。那么就有雷达能够同时覆盖这2个岛。。如果没有重复区间。。那么就需要2个雷达了。。以此类推。。

以上就是这个题目的中心思想。。。具体做时先判断以岛为圆心d为半径画圆能不能与X轴相交。。如果出现不能相交的立即可以得出结论Case 1: -1(注意本题要判断d为负的情况,d为负时也是直接返回结果-1,不做这个判断这题AC不了)。。。。。然后根据左区间的大小把岛从小到大排序(左区间相同的右区间从小到大)。。这样就可以从左往右来做区间的合并了(当然从右到左也可以)。。。具体区间合并时看我上面的代码。。这题第2个难点就是如何分清楚区间的情况。。最好用纸画一画。。

展开阅读全文

Radar Installation

10-26

DescriptionnnAssume 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. nnWe 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. n ![](http://poj.org/images/1328_1.jpg)nFigure A Sample Input of Radar InstallationsnnnInputnnThe 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. nnThe input is terminated by a line containing pair of zeros nOutputnnFor 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.nSample Inputnn3 2n1 2n-3 1n2 1nn1 2n0 2nn0 0nSample OutputnnCase 1: 2nCase 2: 1 问答

Radar Scopes

03-08

You have been hired to a team of software designers to write a new air- traffic control system. One of the functions of this new software is to automatically verify the functioning of the subject aircrafts' instrumentation and alert controllers to endangered, newly aloft, or possibly downed aircraft. You are to write a prototype of this function.nYour program will be given a series of scenarios which include 2 radar sweeps each. Each radar sweep will find 0 to 100 airplanes. Each time a sweep encounters a plane, the data acquisition system captures an azimuth reading and distance (in miles) from the radar. It will also retrieve (from the plane) a squawk number and a ground speed in miles/hour (actually an airspeed with wind corrections). Based on the two radar sweeps, your program is to determine if a warning is required for any plane in the radar's domain.nnYou should assume a radar range (radius of the area covered) of 10 miles and instantaneous sweeps that occur 5 seconds apart.nnBased on the information about the radar and planes, you are to determine if the controllers should be warned of potential problems.nnAn ``equipment warning" is issued if the average of the plane's two indicated airspeeds is not within 10% of the airspeed measured/calculated based on radar sweeps.nnA ``new intrusion" warning is issued if the second radar sweep indicates a plane which was not present in the first sweep, but whose indicated airspeed + 10% is sufficient to have brought the plane onto the scope (on the shortest path) between the two sweeps. If the speed is not sufficient to account for a plane which was already aloft, then the assumption must be made that there is a ``new aloft" warning to be issued because a plane has just taken off within the domain of the radar.nnA ``domain exited" warning is issued if the first sweep of the radar indicates a plane which is not seen in the second sweep but whose indicated airspeed + 10% is sufficient to have accounted for the plane leaving the range of the radar (on the shortest path) within the two sweeps. If the speed is not sufficient to allow the plane to leave the radar scope between the sweeps, a ``domain loss" warning is issued indicating that the plane has either landed or crashed with the controller's domain.nnnInputnnThe first line of each scenario contains a single integer (0 <= N1 <= 100) that indicates the number of planes detected in the first sweep. The next N1 lines each contain the description of exactly one detected plane in sweep 1. Each description contains a squawk number, an azimuth, a distance, and a ground speed. The squawk number is an integer between 1 and 5 digits in length. The azimuth, distance and ground speed are all real numbers in the format XXX.XXX with leading and trailing zeroes as needed to fill all 6 places.nnnThe squawk number (0 < S < 32767) is a globally unique integer that identifies each plane and is used to match planes from sweeps 1 and 2. The azimuth (000.000 <= A <= 359.999) is the angle in degrees from North (sweeping in a circle toward the East) where the plane was detected. Therefore, East is at 90 degrees; South is at 180 degrees; and West is at 270 degrees. The distance (000.000 <= D <= 010.000) is the distance from the radar to the plane (added distance due to altitude has been removed by the radar's sensing logic). The ground speed (000.000 <= G <= 999.999) is the speed at which the plane is moving (in any direction) relative to the radar.nnImmediately following the lines with the descriptions of planes in the first sweep is a line with a single integer (0 <= N2 <= 100) indicating the number of planes detected in the second sweep. The next N2 lines each contain the description of exactly one detected plane in sweep 2.nnThe next scenario (if any) starts with N1 on the next line. You are to read and process scenarios to the end-of-file.nnnOutputnnFor each scenario, you are to print ``Scenario # X" where X is the number of the scenario starting with 1 for the first scenario and incrementing by 1 for successive scenarios. Each subsequent line contains exactly one report for each plane requiring a warning indication. These lines are to be sorted based on the squawk number. Reports consist of the squawk number right-justified in columns 1 to 5 and one of the following warnings `` -- equipment warning", `` -- new intrusion", `` -- new aloft", `` -- domain exited", or `` -- domain loss" starting in column 6. (You must print the blanks and dashes exactly as shown in the strings above.) There are no messages printed for planes for whom no warning applies.nnAfter each scenario, print a blank line.nnnSample Inputnn4 n222 060.111 007.600 095.000 n1496 203.122 009.444 598.991 n111 000.000 005.100 999.999 n013 333.333 006.711 188.448 n4 n111 001.000 003.713 999.999 n777 263.122 009.933 477.633 n333 083.014 004.300 127.122 n222 040.713 009.813 098.125nnnSample OutputnnScenario # 1 n 013 -- domain loss n 222 -- equipment warning n 333 -- new aloft n 777 -- new intrusion n 1496 -- domain exited 问答

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