哈理工2015暑假训练赛 zoj 2078Phone Cell
2015-08-02 22:24
477 查看
Phone CellTime Limit:10000MS Memory Limit:32768KB 64bit IO Format:%lld
& %llu
SubmitStatusPracticeZOJ
2978
Description
Nowadays, everyone has a cellphone, or even two or three. You probably know where their name comes from. Do you. Cellphones can be moved (they are "mobile") and they use wireless connection to static stations called BTS (Base Transceiver Station). Each BTS
covers an area around it and that area is called a cell.
The Czech Technical University runs an experimental private GSM network with a BTS right on top of the building you are in just now. Since the placement of base stations is very important for the network coverage, your task is to create a program that will
find the optimal position for a BTS. The program will be given coordinates of "points of interest". The goal is to find a position that will cover the maximal number of these points. It is supposed that a BTS can cover all points that are no further than some
given distance R. Therefore, the cell has a circular shape.
The picture above shows eight points of interest (little circles) and one of the possible optimal BTS positions (small triangle). For the given distance
R, it is not possible to cover more than four points. Notice that the BTS does not need to be placed in an existing point of interest.
Input
The input consists of several scenarios. Each scenario begins with a line containing two integer numbers
N and R. N is the number of points of interest, 1 <=
N <= 2000. R is the maximal distance the BTS is able to cover, 0 <= R < 10000. Then there are
N lines, each containing two integer numbers Xi,
Yi giving coordinates of the i-th point, |Xi|, |Yi| < 10000. All points are distinct, i.e., no two of them will have the same coordinates.
The scenario is followed by one empty line and then the next scenario begins. The last one is followed by a line containing two zeros.
A point lying at the circle boundary (exactly in the distance R) is considered covered. To avoid floating-point inaccuracies, the input points will be selected in such a way that for any possible subset of points
S that can be covered by a circle with the radius R + 0.001, there will always exist a circle with the radius R that also covers them.
Output
For each scenario, print one line containing the sentence "It is possible to cover M points.", where
M is the maximal number of points of interest that may be covered by a single BTS.
Sample Input
Sample Output
Notes
The first sample input scenario corresponds to the picture, providing that the X axis aims right and Y axis down.
本来模版中有个n^2算法的,但是超时,赛后百度了一下,还有nlogn算法的。那么也可以当作模版来用了。
& %llu
SubmitStatusPracticeZOJ
2978
Description
Nowadays, everyone has a cellphone, or even two or three. You probably know where their name comes from. Do you. Cellphones can be moved (they are "mobile") and they use wireless connection to static stations called BTS (Base Transceiver Station). Each BTS
covers an area around it and that area is called a cell.
The Czech Technical University runs an experimental private GSM network with a BTS right on top of the building you are in just now. Since the placement of base stations is very important for the network coverage, your task is to create a program that will
find the optimal position for a BTS. The program will be given coordinates of "points of interest". The goal is to find a position that will cover the maximal number of these points. It is supposed that a BTS can cover all points that are no further than some
given distance R. Therefore, the cell has a circular shape.
The picture above shows eight points of interest (little circles) and one of the possible optimal BTS positions (small triangle). For the given distance
R, it is not possible to cover more than four points. Notice that the BTS does not need to be placed in an existing point of interest.
Input
The input consists of several scenarios. Each scenario begins with a line containing two integer numbers
N and R. N is the number of points of interest, 1 <=
N <= 2000. R is the maximal distance the BTS is able to cover, 0 <= R < 10000. Then there are
N lines, each containing two integer numbers Xi,
Yi giving coordinates of the i-th point, |Xi|, |Yi| < 10000. All points are distinct, i.e., no two of them will have the same coordinates.
The scenario is followed by one empty line and then the next scenario begins. The last one is followed by a line containing two zeros.
A point lying at the circle boundary (exactly in the distance R) is considered covered. To avoid floating-point inaccuracies, the input points will be selected in such a way that for any possible subset of points
S that can be covered by a circle with the radius R + 0.001, there will always exist a circle with the radius R that also covers them.
Output
For each scenario, print one line containing the sentence "It is possible to cover M points.", where
M is the maximal number of points of interest that may be covered by a single BTS.
Sample Input
8 2 1 2 5 3 5 4 1 4 8 2 4 5 7 5 3 3 2 100 0 100 0 -100 0 0
Sample Output
It is possible to cover 4 points. It is possible to cover 2 points.
Notes
The first sample input scenario corresponds to the picture, providing that the X axis aims right and Y axis down.
本来模版中有个n^2算法的,但是超时,赛后百度了一下,还有nlogn算法的。那么也可以当作模版来用了。
#include <stdio.h> #include <string.h> #include <math.h> #include <iostream> #include <algorithm> using namespace std ; const double eps = 1e-8 ; const double PI = acos(-1.0) ; int n ; double r ; struct point { double x,y ; }p[2010] ; struct node { double angle ; int flag ; }q[4030] ; inline int dcmp(double d) { return d < -eps ? -1 : d > eps ; } bool cmp(const node &a,const node &b)//角度区间排序 { if(dcmp(a.angle-b.angle) == 0 ) return a.flag > b.flag ; return a.angle < b.angle ; } double Sqrt(double x) { return x*x ; } double dist(const point &a,const point &b) { return sqrt(Sqrt(a.x-b.x)+Sqrt(a.y-b.y)) ; } int main() { while(~scanf("%d %lf",&n,&r)) { if(n == 0) break ; for(int i = 0 ; i < n ; i++) scanf("%lf %lf",&p[i].x,&p[i].y) ; int ans = 0 ; for(int i = 0 ; i < n ; i++) { int m = 0 ; for(int j = 0 ; j < n ; j++) { if(i == j) continue ; double d = dist(p[i],p[j]) ; if(d > 2*r+0.001) continue ; double s = atan2(p[j].y-p[i].y,p[j].x-p[i].x) ; if(s < 0) s += 2*PI ;//角度区间修正 double ph = acos(d/2.0/r) ;//圆心角转区间 q[m++].angle = s - ph + 2*PI ;q[m-1].flag = 1 ; q[m++].angle = s + ph + 2*PI ;q[m-1].flag = -1 ; } sort(q,q+m,cmp) ; int sum = 0 ; for(int j = 0 ; j < m ; j++) { ans = max(ans,sum += q[j].flag) ; } } printf("It is possible to cover %d points.\n",ans+1) ; } return 0 ; }
相关文章推荐
- File和File的IO流
- 我的地图二
- 什么是PHP Guzzle?
- HDU 4340 Capturing a country 树形DP
- 像素、分辨率、屏幕大小(屏幕适配必看)
- centos6 python decoder jpeg not available解决办法
- Android 评分组件RatingBar、ImageView图片、 ImageButton图片按钮的综合运用
- 测试打印功能
- HDU 1251 统计难题(Trie tree)
- 华为机试题-判断一个数字中是否包含两个相同的子串
- 忍不住WIN10了
- Oracle RAC安装过程中碰到的“坑”和关键点(二)
- Java多线程初探--进阶篇
- android上传图片到PHP后台全过程
- mssql:sp_executesql与exec(@sql)
- 7-31
- Xcode的快捷键及代码格式化
- Github Pages 静态网页建站
- C# Hadoop学习笔记(一)
- 移植u-boot-2015.07-rc3之修改代码支持NorFlash启动并真正支持NorFlash读写(五)