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 )
 
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 }
View Code

 

posted @ 2014-08-15 13:53  Oyking  阅读(479)  评论(0编辑  收藏  举报