其他分享
首页 > 其他分享> > 【模板】计几 单位圆最多覆盖多少点

【模板】计几 单位圆最多覆盖多少点

作者:互联网

题目链接:https://vjudge.net/problem/POJ-1981

由于选择的单位圆肯定至少覆盖一个点,所以我们枚举i作为单位圆必定覆盖的点,然后单位圆的圆心必定在以点 i 为圆心的单位圆上,然后枚举其他点 j ,只要单位圆圆心在以 j 为圆心的单位圆上,那么选的单位圆就可以覆盖到点 j ,所以 点 j 的单位圆和点 i 的单位圆相交的弧上的点作为选择的单位圆圆心,便可以覆盖点 i 和 点 j ,那么n²枚举 i j 。然后用logn对弧区间排序,选取相交弧最多的即可。

代码:

 1 /*************************************************************************
 2     > File Name: poj1981.cpp
 3 # File Name: poj1981.cpp
 4 # Author : xiaobuxie
 5 # QQ : 760427180
 6 # Email:760427180@qq.com
 7 # Created Time: 2019年10月10日 星期四 16时47分41秒
 8  ************************************************************************/
 9 
10 #include<iostream>
11 #include<cstdio>
12 #include<map>
13 #include<cmath>
14 #include<cstring>
15 #include<set>
16 #include<queue>
17 #include<vector>
18 #include<algorithm>
19 using namespace std;
20 typedef long long ll;
21 #define inf 0x3f3f3f3f
22 #define pii pair<double,int> pii
23 #define pq priority_queue<int,vector<int>,greater<int> >
24 ll gcd(ll a,ll b){
25     if(a<b) return gcd(b,a);
26     return b==0?a:gcd(b,a%b);
27 }
28 const int N = 300+9;
29 struct Point{
30     double x,y;
31 }p[N];
32 int n;
33 pair<double,int> tmp[N<<1];
34 double dist(Point a,Point b){
35     return sqrt( (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y) );
36 }
37 void solve(){
38     int ans = 1;
39     for(int i = 1;i<=n;++i){
40         int cnt = 0;
41         for(int j=1;j<=n;++j){
42             if(i==j) continue;
43             double d = dist(p[i],p[j]);
44             if(d > 2) continue;
45             double ang = atan2(p[j].y-p[i].y,p[j].x-p[i].x);
46             double deta = acos(d/2);
47             tmp[++cnt] = make_pair(ang + deta,0);
48             tmp[++cnt] = make_pair(ang - deta,1);
49         }
50         sort(tmp+1,tmp+1+cnt);
51         int now = 1;
52         for(int i =1;i<=cnt;++i){
53             if(tmp[i].second){
54                 ++now;
55                 ans = max(ans,now);
56             }
57             else --now;
58         }
59     }
60     printf("%d\n",ans);
61 }
62 int main(){
63     while(~scanf("%d",&n) && n){
64         for(int i = 1;i<=n;++i) scanf("%lf%lf",&p[i].x,&p[i].y);
65         solve();
66     }
67     return 0;
68 }
View Code

 

标签:tmp,计几,cnt,覆盖,deta,ll,单位,include,模板
来源: https://www.cnblogs.com/xiaobuxie/p/11655830.html