2021杭电多校第八场 HDU7063-Square Card(求两圆相交面积)

简介: 2021杭电多校第八场 HDU7063-Square Card(求两圆相交面积)

传送门

思路:

  • 很细节的题,要好好读题!
  • 首先,正方形可以绕中心旋转,由于正方形落到圆的概率不是很好计算,看怎么才能转化一下。
  • 找一个边界值,比如下图中的,正方形再向下一点就会出界。所以只要正方形的中心在蓝色圆里就能够保证正方形落到绿色的大圆里。

20200401134307494.png

  • 这样就把正方形抽象成一个点了。根据红色的直角三角形可以计算出蓝色圆的半径,对两个原始圆求交集就是分子的答案,原始圆的蓝色圆面积就是分母的答案;
  • 还有一个细节就是题目里只说了第一个圆足够大,没说奖励圆足够大,要特判一下正方形不能放到奖励圆的情况。

代码:

struct point{
  double x,y;
};
double c(point a, double r1, point b, double r2,double t)
{
  double d = sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y));
  if (d >= r1+r2)
    return 0;
  //if(d==r1+r2) return t*t;
  if (r1>r2){
    double tmp = r1;
    r1 = r2;
    r2 = tmp;
  }
  if(r2 - r1 >= d)
    return pi*r1*r1;
  double g1=acos((r1*r1+d*d-r2*r2)/(2*r1*d));
  double g2=acos((r2*r2+d*d-r1*r1)/(2*r2*d));
  return g1*r1*r1 + g2*r2*r2 - r1*d*sin(g1);
}
int main(){
  int _=read;
  while(_--){
    double x1,y1,r1,x2,y2,r2,a;
    cin>>r1>>x1>>y1>>r2>>x2>>y2>>a;
    if(r2*r2-a*a/4<=0) puts("0.000000");
    else{
      double R1=sqrt(r1*r1-a*a/4)-a/2;
      double R2=sqrt(r2*r2-a*a/4)-a/2;
      //cout<<R1<<" "<<R2<<endl;
      point t1={x1,y1},t2={x2,y2};
      printf("%.6f\n",c(t1,R1,t2,R2,a)/(pi*R1*R1));
    }
  }
  return 0;
}
目录
相关文章
|
7月前
|
Serverless C++
[C++/PTA] 计算点到直线的距离一一友元函数的应用
[C++/PTA] 计算点到直线的距离一一友元函数的应用
165 0
Leecode 695. 岛屿的最大面积
Leecode 695. 岛屿的最大面积
43 0
|
Serverless C++
C++/PTA CCircle圆类求圆环面积
定义一个名为CCircle的圆类,要求: 1.其属性数据为圆的半径radius; 2.定义构造函数; 3.成员函数area()计算圆的面积。 4.编写主函数计算一个内径和外径分别为a和b的圆环的面积,其中a和b由键盘输入,π取值为3.14159。
248 0
HDU-1071,The area(求面积水题)
HDU-1071,The area(求面积水题)
|
机器学习/深度学习
HDOJ(HDU) 2524 矩形A + B(推导公式、)
HDOJ(HDU) 2524 矩形A + B(推导公式、)
103 0
HDOJ(HDU) 2524 矩形A + B(推导公式、)
HDOJ(HDU) 2088 Box of Bricks(平均值)
HDOJ(HDU) 2088 Box of Bricks(平均值)
93 0
HDOJ(HDU) 2088 Box of Bricks(平均值)
【PTA】7-8 显示菱形 (10point(s))
【PTA】7-8 显示菱形 (10point(s))
1334 0