zoukankan      html  css  js  c++  java
  • 【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
    ",ans);
    72     }
    73     return 0;
    74 }
  • 相关阅读:
    Fiddler基础与HTTP状态码
    Fiddler与F12设置代理
    人和机器猜拳游戏
    ng-model 取不到值
    git的使用
    笔记
    INSPIRED启示录 读书笔记
    INSPIRED启示录 读书笔记
    INSPIRED启示录 读书笔记
    INSPIRED启示录 读书笔记
  • 原文地址:https://www.cnblogs.com/myx12345/p/9435543.html
Copyright © 2011-2022 走看看