zoukankan      html  css  js  c++  java
  • 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
    ", asr(fl, fr, 1e-5));
    40     }
    41 }
    View Code
  • 相关阅读:
    生成括号问题(22)
    Starting Jetty: Exception in thread "main" java.lang.UnsupportedClassVersionError: org/eclipse/jetty/start/Main : Unsupported major.minor version 52.0
    Oracle 使用Nid 修改数据库的DBID 和 Database Name
    Oracle SCN与时间的相互转换
    Oracle 启动 停止JOB
    Apache 负载均衡 端口转发 配置
    Oracle 将 A 用户下所有表的增删改查 赋予 B 用户
    更改表空间及数据文件的名称
    Oracle 缓存命中率问题一则(里面有个问题咨询大佬们)
    更改python版本
  • 原文地址:https://www.cnblogs.com/oyking/p/3914716.html
Copyright © 2011-2022 走看看