【HDOJ6354】Everything Has Changed(计算几何)

题意:

给定一个平面和一个(0,0)为中心的大圆,有n个小圆保证没有两两之间相交与覆盖整个大圆的情况,求小圆覆盖后大圆的周长并

1m100, -1e3<=x[i],y[i]<=1e3,

思路:

高中数学几何题,余弦定理算圆心角

每加一个圆就把覆盖掉的周长减掉,增加的周长加上

把内含,外切,不相交的三种情况特判掉

acos算出来的是弧度

考试时候不会推也是醉了

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<string>
 4 #include<cmath>
 5 #include<iostream>
 6 #include<algorithm>
 7 #include<map>
 8 #include<set>
 9 #include<queue>
10 #include<vector>
11 using namespace std;
12 typedef long long ll;
13 typedef unsigned int uint;
14 typedef unsigned long long ull;
15 typedef pair<int,int> PII;
16 typedef vector<int> VI;
17 #define fi first
18 #define se second 
19 #define MP make_pair
20 #define N   11000000
21 #define MOD 1000000007
22 #define eps 1e-8 
23 #define pi acos(-1)
24 
25 int gao(double x)
26 {
27     if(fabs(x)<eps) return 0;
28     if(x<eps) return -1;
29      else return 1;
30 }
31 
32 int read()
33 { 
34    int v=0,f=1;
35    char c=getchar();
36    while(c<48||57<c) {if(c=='-') f=-1; c=getchar();}
37    while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar();
38    return v*f;
39 }
40 
41 
42 int main()
43 {
44 
45     int cas;
46     scanf("%d",&cas);
47     while(cas--)
48     {
49         int n;
50         double R;
51         scanf("%d%lf",&n,&R);
52         double ans=R*pi*2;
53         for(int i=1;i<=n;i++) 
54         {
55             double x,y,r;
56             scanf("%lf%lf%lf",&x,&y,&r);
57             double l=sqrt(x*x+y*y);
58             if(gao(l-r-R)>=0||gao(l-R+r)<0) continue;
59             if(gao(l-R+r)==0)
60             {
61                 ans+=r*pi*2;
62                 continue;
63             }
64                double s1=(R*R+l*l-r*r)/(2*R*l);
65                double s2=(r*r+l*l-R*R)/(2*r*l);
66                s1=2*acos(s1);
67                s2=2*acos(s2);
68                ans+=r*s2;
69                ans-=R*s1;
70         }
71         printf("%.8f\n",ans);
72     }
73     return 0;
74 }

 

posted on 2018-08-07 10:29  myx12345  阅读(112)  评论(0编辑  收藏  举报

导航