标签:names 平面 span bsp 相交 har map 中心 long
题意:
给定一个平面和一个(0,0)为中心的大圆,有n个小圆保证没有两两之间相交与覆盖整个大圆的情况,求小圆覆盖后大圆的周长并
1≤m≤100, -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 }
【HDOJ6354】Everything Has Changed(计算几何)
标签:names 平面 span bsp 相交 har map 中心 long
原文地址:https://www.cnblogs.com/myx12345/p/9435543.html