HDU1883 Phone Cell
2012-09-10 14:10
281 查看
如上图,设A、B为点集中的两个点, 分别以A、B为圆心作单位圆,则相交范围内的任意位置作新的单位圆,都可以同时包含A与B,如圆C,如果把C放在一个其中一个圆A的圆周上,则圆C的圆周会穿过点A。
假设已得到题目的一个解圆O,则把得到的圆O通过移动,总可以让圆内的某个点X靠在圆周上,换言之,O也在X所作单位圆的圆周上。
由此,可枚举在最终结果的圆周上的点X,目标圆心O在X的圆周上。
每枚举一个X作为图中的点A,枚举其他所有点作为点B,可得到C对应点A、B的在A圆周上的一个范围,覆盖次数最多的那个范围就是当X作为点O圆周上的点所能得到的最优解O的范围,这个次数加1(点X)就是对应X的最优解。
通过枚举所有X,更新出最优解。
覆盖范围可以用圆周角表示,则为区间覆盖问题。
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #include<algorithm> const int maxn = 2111; const double eps = 1e-8; const double pi = acos(-1.0); int n, R, ctp; inline int dcmp(double x) {return (x > eps) - (x < -eps);} inline double Sqr(double x){return x * x;} struct Point {int x, y;} p[maxn]; inline double CalDis(const Point &a, const Point &b) {return sqrt(Sqr(a.x - b.x) + Sqr(a.y - b.y));} struct Cov { double site; int se;}cover[maxn <<2]; int AScomp(const void *a, const void *b)//角度区间排序 { if(!dcmp((*(Cov*)a).site - (*(Cov*)b).site)) return -((*(Cov*)a).se - (*(Cov*)b).se); return dcmp((*(Cov*)a).site - (*(Cov*)b).site); } void AngManage(double &x)//角度区间修正,(-pi, pi] { while(x + pi < eps) x += 2 * pi; while(x - pi > eps) x -= 2 * pi; } void AddAnSeg(double start, double end)//圆心角转区间 { AngManage(start), AngManage(end); if(start - end > eps) AddAnSeg(start, pi), AddAnSeg(-pi + eps * 2, end); else { cover[ctp].site = start, cover[ctp].se = 1;++ ctp; cover[ctp].site = end, cover[ctp].se = -1;++ ctp; } } int MakeAns() { int i, j, ans = 0, cnt; double dis, ang, ac, RR = 2 * (R + 0.001); for(i = 0 ; i < n; ++ i) { for(j = ctp = 0; j < n; ++ j) if(j != i && (dis = CalDis(p[i], p[j])) < RR) { ang = atan2((double)p[j].y - p[i].y, (double)p[j].x - p[i].x); ac = acos(dis * 0.5 / R); AddAnSeg(ang - ac, ang + ac); } qsort(cover, ctp, sizeof(Cov), AScomp); for(j = cnt = 0; j < ctp; ++ j) ans = std::max(ans, cnt += cover[j].se); } return ans + 1; } int main() { while(scanf("%d%d", &n, &R), n | R) { for(int i = 0; i < n; ++ i) scanf("%d%d", &p[i].x, &p[i].y); printf("It is possible to cover %d points.\n", MakeAns()); } return 0; }
相关文章推荐
- POJ 3659 Cell Phone Network(树形DP)
- HDU 4026 Unlock the Cell Phone( 状态压缩 )
- HDU 4026 Unlock the Cell Phone 状压dp(类似TSP)
- POJ3659 Cell Phone Network(树上最小支配集:树型DP)
- poj 3659 Cell Phone Network USACO 树形DP
- 3708: The Key Locker of Cell Phone
- poj 3659 Cell Phone Network 贪心
- Codeforces Round #361 (Div. 2) A. Mike and Cellphone
- Lession 9-10 Cell Phone Taboos
- codeforces 361 A - Mike and Cellphone
- poj 3659 Cell Phone Network(树的最小支配集树形DP)
- POJ3659 Cell Phone Network【最小支配集】【贪心】
- n.boj 389 Shaking Your Cellphone(6th bupt acm problem D)
- 洛谷P2899 [USACO08JAN]手机网络Cell Phone Network
- poj 3659 Cell Phone Network 树型DP也是树的最小支配集
- POJ 3659 Cell Phone Network
- HDU 1883 Phone Cell (圆覆盖最多点)
- 【POJ】3659 Cell Phone Network 树上的极小支配集——树型DP
- codeforces 689A A. Mike and Cellphone(水题)
- Codeforces-689A-Mike and Cellphone