【模板】计几 单位圆最多覆盖多少点
作者:互联网
题目链接: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