题面:
题意:
给定三个同心圆,在这三个圆上分别选择一点,然后问这三点组成的三角形的面积的期望值。
官方题解:
题解:
就是说A点任意确定即可,然后我们可以等分一个半圆枚举B点,求出C点到AB距离的期望。
一开始是写出AB的表达式,然后再用距离公式求出期望,发现。。。积分积不动。
参考这张图。
A点是确定一点,B点是等分枚举点。
设当前B点的坐标为 (r2cosα,r2sinα)
我们转换坐标系,其中x轴垂直于AB。
我们设D为最大圆上一点,坐标为 (r3cosβ,r3sinβ),那么D点到直线AB的距离为
∣r3∗sin∠OCE−r3∗cosβ∣,我们设∠OCE为p(p可求)
那么D到直线AB的距离就是 ∣r3∗sinp−r3∗cosβ∣
那么从 0到2∗pi的∫∣r3∗sinp−r3∗cosβ∣dβ/(2∗pi)就是期望距离
ans=2∗r3∗(0到pi)的∫∣sinp−cosβ∣dβ/(2∗pi)
由cos(pi/2−α)=sinα和sinp=cosβ
可分为0−−pi/2−p和pi/2−p−−pi上的积分。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<string>
#include<queue>
#include<bitset>
#include<map>
#include<unordered_map>
#include<set>
#define ui unsigned int
#define ll long long
#define llu unsigned ll
#define ld long double
#define pr make_pair
#define pb push_back
//#define lc (cnt<<1)
//#define rc (cnt<<1|1)
#define len(x) (t[(x)].r-t[(x)].l+1)
#define tmid ((l+r)>>1)
using namespace std;
const int inf=0x3f3f3f3f;
const ll lnf=0x3f3f3f3f3f3f3f3f;
const double dnf=1e18;
const int mod=1e9+7;
const double eps=1e-8;
const double pi=acos(-1.0);
const int hp=13331;
const int maxn=100100;
const int maxm=100100;
const int up=1000;
int main(void)
{
int t;
scanf("%d",&t);
while(t--)
{
int r1,r2,r3;
scanf("%d%d%d",&r1,&r2,&r3);
if(r1>r2) swap(r1,r2);
if(r2>r3) swap(r2,r3);
if(r1>r2) swap(r1,r2);
double ans=0;
double x1=r1,y1=0;
for(int i=1;i<=up;i++)
{
double aerfa=(i-0.5)/up*pi;
double x2=r2*cos(aerfa),y2=r2*sin(aerfa);
double disab=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
double d=r1*r2*sin(aerfa)/disab;
double p=asin(d/r3);
double exdis=2*r3*(cos(p)+p*sin(p))/pi;
ans+=disab*exdis/2;
}
printf("%.1f\n",ans/up);
}
return 0;
}