# 【POJ 3004】Subway planning（极角排序+贪心）

2016-09-08 09:34:54         来源：ACMer'

Subway planning
 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 1384 Accepted: 375

Description

The government in a foreign country is looking into the possibility of establishing a subway system in its capital. Because of practical reasons, they would like each subway line to start at the central station and then go in a straight line in some angle as far as necessary. You have been hired to investigate whether such an approach is feasible. Given the coordinates of important places in the city as well as the maximum distance these places can be from a subway station (possibly the central station, which is already built), your job is to calculate the minimum number of subway lines needed. You may assume that any number of subway stations can be built along a subway line.

Figure 1: The figure above corresponds to the first data set in the example input.

Input

The first line in the input file contains an integer N, the number of data sets to follow. Each set starts with two integers, n and d (1 ≤ n ≤ 500, 0 ≤ d < 150). n is the number of important places in the city that must have a subway station nearby, and d is the maximum distance allowed between an important place and a subway station. Then comes n lines, each line containing two integers x and y (-100 ≤ x, y ≤ 100), the coordinates of an important place in the capital. The central station will always have coordinates 0, 0. All pairs of coordinates within a data set will be distinct (and none will be 0, 0).

Output

For each data set, output a single integer on a line by itself: the minimum number of subway lines needed to make sure all important places in the city is at a distance of at most d from a subway station.

Sample Input

```2
7 1
-1 -4
-3 1
-3 -1
2 3
2 4
2 -2
6 -2
4 0
0 4
-12 18
0 27
-34 51```

Sample Output

```4
2```

Hint

Source

Svenskt M?sterskap i Programmering/Norgesmesterskapet 2003

```#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define LL long long
#define Pr pair
#define fwrite(ch) freopen(ch,"w",stdout)

using namespace std;
const int INF = 0x3f3f3f3f;
const int msz = 10000;
const int mod = 1e9+7;
const double eps = 1e-8;
const int MAXN = 555;
const double PI = acos(-1);

double dcmp(double x)
{
return fabs(x) <= eps? 0: x - eps;
}

struct Point
{
double x,y,l,r;

Point(){}
Point(double _x,double _y):x(_x),y(_y){}

double operator -(const struct Point a)const
{
return sqrt((x-a.x)*(x-a.x)+(y-a.y)*(y-a.y));
}

bool operator <(const struct Point a)const
{
return l < a.l;
}
};

Point pt[MAXN<<1];

int main()
{
//fwrite("");

int n,t;
double d;

scanf("%d",&t);

while(t--)
{
scanf("%d%lf",&n,&d);

for(int i = 0; i < n; ++i)
{
scanf("%lf%lf",&pt[i].x,&pt[i].y);
if(dcmp(pt[i]-Point(0,0)-d) <= 0) --i,--n;
else
{
double tmp = asin(d/(pt[i]-Point(0,0)));
pt[i].l = pt[i].r = atan2(pt[i].x,pt[i].y);

pt[i].l -= tmp;
pt[i].r += tmp;
}
}

sort(pt,pt+n);

for(int i = n; i < (n<<1); ++i)
{
pt[i] = pt[i-n];
pt[i].l += PI*2;
pt[i].r += PI*2;
}

//for(int i = 0; i < n; ++i)
//{
//  printf("(%f,%f) %f~%f\n",pt[i].x,pt[i].y,pt[i].l,pt[i].r);
//}

double r;
int ans = n;

for(int i = 0; i < n; ++i)
{
int tmp = 1;
r = pt[i].r;

for(int j = i; j < i+n; ++j)
{
//printf("%f %f %f\n",r,pt[j].l,pt[j].r);
if(dcmp(r-pt[j].l) >= 0) r = min(r,pt[j].r);
else
{
tmp++;
r = pt[j].r;
}
}
ans = min(ans,tmp);
}

printf("%d\n",ans);
}

return 0;
}

```