HDU 1724 Ellipse(数值积分の辛普森公式)
Problem Description
Math is important!! Many students failed in 2+2’s mathematical test, so let's AC this problem to mourn for our lost youth..
Look this sample picture:
A ellipses in the plane and center in point O. the L,R lines will be vertical through the X-axis. The problem is calculating the blue intersection area. But calculating the intersection area is dull, so I have turn to you, a talent of programmer. Your task is tell me the result of calculations.(defined PI=3.14159265 , The area of an ellipse A=PI*a*b )
Look this sample picture:
A ellipses in the plane and center in point O. the L,R lines will be vertical through the X-axis. The problem is calculating the blue intersection area. But calculating the intersection area is dull, so I have turn to you, a talent of programmer. Your task is tell me the result of calculations.(defined PI=3.14159265 , The area of an ellipse A=PI*a*b )
Input
Input may contain multiple test cases. The first line is a positive integer N, denoting the number of test cases below. One case One line. The line will consist of a pair of integers a and b, denoting the ellipse equation , A pair of integers l and r, mean the L is (l, 0) and R is (r, 0). (-a <= l <= r <= a).
Output
For each case, output one line containing a float, the area of the intersection, accurate to three decimals after the decimal point.
题目大意:给椭圆的a、b参数,求区间[l, r]的椭圆积分的和。
思路:直接套用辛普森公式,贴个模板。
代码(93MS):
1 #include <cmath> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <iostream> 6 using namespace std; 7 8 double fa, fb, fl, fr; 9 int n; 10 11 double sqr(double x) { 12 return x * x; 13 } 14 15 double func(double x) { 16 return 2 * sqrt(sqr(fb) * (1 - sqr(x) / sqr(fa))); 17 } 18 19 double simpson(double a, double b) { 20 double mid = a + (b - a) / 2; 21 return (func(a) + 4 * func(mid) + func(b)) * (b - a) / 6; 22 } 23 24 double asr(double a, double b, double eps, double A) { 25 double mid = a + (b - a) / 2; 26 double l = simpson(a, mid), r = simpson(mid, b); 27 if(fabs(l + r - A) <= 15 * eps) return l + r + (l + r - A) / 15; 28 return asr(a, mid, eps / 2, l) + asr(mid, b, eps / 2, r); 29 } 30 31 double asr(double a, double b, double eps) { 32 return asr(a, b, eps, simpson(a, b)); 33 } 34 35 int main() { 36 scanf("%d", &n); 37 while(n--) { 38 scanf("%lf%lf%lf%lf", &fa, &fb, &fl, &fr); 39 printf("%.3f\n", asr(fl, fr, 1e-5)); 40 } 41 }