题意是给定一个椭圆标准方程的a,b(椭圆的长半轴长和短半轴长),在【0,b】内取一个数,则过点(0,b)且平行于x轴的直线与椭圆交于两点,再将此两点关于x轴做对称点,顺次连接此四点构成矩形,求出这些矩形周长的期望。
一开始的时候,想到所有矩形的周长和积分就是椭圆面积的两倍,但矩形的个数应该是 a + b,可是与样例不符......又尝试了矩形个数为a,b,π/2,均不对。再次读题,发现矩形的选择是在【0,b】中选的,那么矩形的个数就应该是b个。
依照题意,用积分的方法做,可得:
积分后得:a*b*π+2*b*b;再除以b,得到期望。
要注意的是题目要求保留到小数点后六位,但不是四舍五入的方式,而是去尾法,这里本人用的方法是先乘以1000000去尾,再除以1000000。
但后来发现网上还有好办法:将结果减去0.0000005,再直接四舍五入保留到后六位。妙啊~~

1 #include <cstdio> 2 #include <cmath> 3 using namespace std; 4 int main() 5 { 6 int t,n,m; 7 const double p = acos(-1); 8 scanf("%d",&t); 9 while (t--) 10 { 11 scanf("%d%d",&n,&m); 12 double ans = n*p+m*2.00; 13 ans *= 1000000; 14 ans = floor(ans); 15 ans /= 1000000; 16 printf("%.6lf ",ans); 17 } 18 return 0; 19 }
个人认为椭圆面积*2应该等于所有矩形周长和,如图示,
但结果是2*a*b*π,而非积分结果a*b*π+2*b*b,我觉得应该是椭圆上点的分布不均导致的,具体的因为才疏学浅,无法详细描述。仍在考虑中......