poj 1981

不是啊。我就想写个傻逼题玩玩。怎么都这么自闭啊。

找个单位圆覆盖最多的点。

n^3显然。然后被卡了。

懒得优化,考虑n^2logn的做法。

地址:https://www.cnblogs.com/weeping/p/7655975.html

相当于对每个角度记录一下贡献然后排个序扫一下。

 1 #include <cstdio>
 2 #include <cmath>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 typedef double db;
 7 const db eps=1e-7;
 8 const db pi=acos(-1);
 9 int sign(db k){
10     if (k>eps) return 1; else if (k<-eps) return -1; return 0;
11 }
12 int cmp(db k1,db k2){return sign(k1-k2);}
13 struct point{
14     db x,y;
15     point operator + (const point &k1) const{return (point){k1.x+x,k1.y+y};}
16     point operator - (const point &k1) const{return (point){x-k1.x,y-k1.y};}
17     point operator * (db k1) const{return (point){x*k1,y*k1};}
18     point operator / (db k1) const{return (point){x/k1,y/k1};}
19     db abs(){return sqrt(x*x+y*y);}
20     db abs2(){return x*x+y*y;}
21     db dis(point k1){return ((*this)-k1).abs();}
22     point unit(){db w=abs(); return (point){x/w,y/w};}
23     point turn90(){return (point){-y,x};}
24     bool operator < (const point k1) const{
25         int a=cmp(x,k1.x);
26         if (a==-1) return 1; else if (a==1) return 0; else return cmp(y,k1.y)==-1;
27     }
28 };
29 int n;point p[307],l[612];
30 int main(){
31     while (scanf("%d",&n)&&n){
32         for(int i=1;i<=n;i++){
33             scanf("%lf%lf",&p[i].x,&p[i].y);
34         }
35         if(n==1){
36             printf("1
");
37         }else{
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                     db d = p[i].dis(p[j])/2;
44                     if(cmp(d,1)>0)continue;
45                     db alf = atan2(p[j].y-p[i].y,p[j].x-p[i].x);
46                     db dlt = acos(d);
47                     l[cnt++]={alf-dlt,1};
48                     l[cnt++]={alf+dlt,-1};
49                 }
50                 sort(l,l+cnt);
51                 int res = 1;
52                 for(int j=0;j<cnt;j++){
53                     if(cmp(l[j].y,1)==0)res++;
54                     else res--;
55                     ans=max(ans,res);
56                 }
57             }
58             printf("%d
",ans);
59         }
60     }
61 }
原文地址:https://www.cnblogs.com/MXang/p/10820568.html