【POJ 3004】Subway planning(极角排序+贪心)
来源:互联网 发布:电动汽车数据 编辑:程序博客网 时间:2024/05/01 09:12
Time Limit: 2000MSMemory Limit: 65536KTotal Submissions: 1384Accepted: 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.
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
27 1-1 -4-3 1-3 -12 32 42 -26 -24 00 4-12 180 27-34 51
Sample Output
42
Hint
Source
Svenskt Mästerskap i Programmering/Norgesmesterskapet 2003
不得不说 今天题感很好~~自满一下~~~
切几何都1A了,而且都是之前不太有思路的题。做题做多了经验也就多了啊~
题目大意:
二维坐标平面里n个点,从原点出发可以画任意条线段,要求每个点附近都有至少一条距离d的线段。问最少画几条线段能满足要求。
如果距离原点为d内,也不需要线段。这些点可以先扣去。
其余点可以先找到与原点构成的线段的极角弧度。然后对于该点满足条件的线段,其实就是原点到 以该点为圆心,d为半径的圆的两条切线内部的点。
借张图:
http://blog.csdn.net/lin375691011/article/details/38852129
其实这张图大家应该看过不知多少遍了=。=
这样把每个点做成一个区间,区间边界为左右切线的弧度值。
然后按照区间最小点覆盖那一套来。
这里有一个处理很妙,原本的二维坐标平面内极角范围是
代码如下:
#include <iostream>#include <cmath>#include <vector>#include <cstdlib>#include <cstdio>#include <climits>#include <ctime>#include <cstring>#include <queue>#include <stack>#include <list>#include <algorithm>#include <map>#include <set>#define LL long long#define Pr pair<int,int>#define fread(ch) freopen(ch,"r",stdin)#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(){ //fread(""); //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;}
0 0
- 【POJ 3004】Subway planning(极角排序+贪心)
- POJ 3004 Subway planning 笔记
- POJ 3004 && HDU 1922 Subway planning
- Planning(贪心)
- poj Subway(dijkstra)
- bzoj1836: Pku3004 Subway planning
- POJ 2502 Subway(迪杰斯特拉)
- POJ 2502 Subway (Djikstra)
- CodeForces 371 E.Subway Innovation(贪心)
- Subway POJ
- Subway POJ
- Codeforces Round #433 C. Planning(贪心)
- (codeforces 853A)Planning 贪心
- poj 2502 Subway(dijkstra 最短路)
- poj 2502 Subway (最短路 Dijksta)
- 【POJ 2502】Subway(最短路dij)
- POJ 2502 - Subway(单源最短路)
- HDU1922 POJ3004 Subway planning “神题”留名
- Tensorflow学习笔记(二)MNIST入门
- android ListView+CheckBox实现单选
- andriod 无网络逻辑设置和判断
- HttpClient4.5+Jsoup实现抓取网页
- Linux学习笔记(二)g++_gdb
- 【POJ 3004】Subway planning(极角排序+贪心)
- 单例模式的进化过程
- C++get函数
- 静思人生
- 1008. Elevator (20)
- 第2周项目2-程序的多文件组织
- OkHttp3源码详解(二整体流程)
- Java笔记 - 抽象类
- (转)Html的样式使用