辛普森积分法 - 维基百科,自由的百科全书

Simpson's rule - Wikipedia, the free encyclopedia

  利用这个公式,用二分的方法来计算积分。

1071 ( The area )

 #include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath> using namespace std; const double EPS = 1e-;
double A, B, C, P, Q; template<class T> T sqr(T x) { return x * x;}
inline double cal(double x) { return A * sqr(x) + (B - P) * x + C - Q;}
inline double sps(double l, double r) { return (cal(l) + cal(r) + * cal((l + r) / )) / * (r - l);} double work(double l, double r) {
//cout << l << ' ' << r << endl;
double ans = sps(l, r), m = (l + r) / ;
if (fabs(ans - sps(l, m) - sps(m, r)) < EPS) return ans;
else return work(l, m) + work(m, r);
} int main() {
int T;
double l, r;
double x[], y[];
cin >> T;
while (T--) {
for (int i = ; i < ; i++) cin >> x[i] >> y[i];
double p[], q[], d[];
for (int i = ; i < ; i++) p[i] = sqr(x[i]) - sqr(x[i + ]), q[i] = x[i] - x[i + ], d[i] = y[i] - y[i + ];
A = (q[] * d[] - q[] * d[]) / (p[] * q[] - p[] * q[]);
B = (p[] * d[] - p[] * d[]) / (p[] * q[] - p[] * q[]);
C = y[] - B * x[] - A * sqr(x[]);
//cout << A << ' ' << B << ' ' << C << endl;
P = (y[] - y[]) / (x[] - x[]);
Q = y[] - P * x[];
//cout << P << ' ' << Q << endl;
printf("%.2f\n", work(x[], x[]));
}
return ;
}

1724 ( Ellipse )

 #include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath> using namespace std; const double EPS = 1e-;
double A, B; template<class T> T sqr(T x) { return x * x;}
inline double cal(double x) { return * B * sqrt( - sqr(x) / sqr(A));}
inline double sps(double l, double r) { return (cal(l) + cal(r) + * cal((l + r) / )) / * (r - l);} double work(double l, double r) {
//cout << l << ' ' << r << endl;
double ans = sps(l, r), m = (l + r) / ;
if (fabs(ans - sps(l, m) - sps(m, r)) < EPS) return ans;
else return work(l, m) + work(m, r);
} int main() {
int T;
double l, r;
cin >> T;
while (T-- && cin >> A >> B >> l >> r) printf("%.3f\n", work(l, r));
return ;
}

  之后还有题会继续更新。

UPD:

  就是因为见过这题,所以才学这个公式的。1y~

ACM-ICPC Live Archive

 #include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath> using namespace std; double coe[][];
const double EPS = 1e-; int k;
double cal(double x, double *c) {
double ret = c[];
for (int i = ; i <= k; i++) ret *= x, ret += c[i];
return ret;
} inline double cal(double x, double *p, double *q) { return cal(x, p) / cal(x, q);}
inline double cal(double x, double y, double *p, double *q) { return max(cal(x, p, q) - y, 0.0);}
inline double simpson(double y, double l, double r, double *p, double *q) { return (cal(l, y, p, q) + cal(r, y, p, q) + * cal((l + r) / , y, p, q)) * (r - l) / ;} inline double getpart(double y, double l, double r, double *p, double *q) {
double sum = simpson(y, l, r, p, q);
//cout << l << ' ' << r << ' ' << sum << endl;
if (fabs(sum - simpson(y, l, (l + r) / , p, q) - simpson(y, (l + r) / , r, p, q)) < EPS) return sum;
return getpart(y, l, (l + r) / , p, q) + getpart(y, (l + r) / , r, p, q);
} inline double getarea(double y, double l, double r, double *p, double *q) {
double ret = , d = (r - l) / ;
for (int i = ; i < ; i++) {
ret += getpart(y, l + d * i, l + d * (i + ), p, q);
}
return ret;
} double dc2(double l, double r, double a, double w) {
double m;
while (r - l > EPS) {
m = (l + r) / 2.0;
//cout << m << ' ' << getarea(m, 0, w, coe[0], coe[1]) - getarea(m, 0, w, coe[2], coe[3]) << endl;
if (getarea(m, , w, coe[], coe[]) - getarea(m, , w, coe[], coe[]) > a) l = m;
else r = m;
}
return l;
} int main() {
//freopen("in", "r", stdin);
//freopen("out", "w", stdout);
double w, d, a;
while (cin >> w >> d >> a >> k) {
for (int i = ; i < ; i++) for (int j = ; j <= k; j++) cin >> coe[i][j];
for (int i = ; i < ; i++) reverse(coe[i], coe[i] + k + );
//cout << getarea(-5.51389, 0, w, coe[0], coe[1]) - getarea(-5.51389, 0, w, coe[2], coe[3]) << endl;
//cout << cal(3, coe[0], coe[1]) << endl;
printf("%.5f\n", -dc2(-d, , a, w));
}
return ;
}

——written by Lyon

Simpson公式的应用(HDU 1724/ HDU 1071)的更多相关文章

  1. HDU 1724 Ellipse 【自适应Simpson积分】

    Ellipse Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  2. hdu 1724 Ellipse simpson积分

    /* hdu 1724 Ellipse simpson积分 求椭圆的部分面积 simpson积分法 http://zh.wikipedia.org/zh-tw/%E8%BE%9B%E6%99%AE%E ...

  3. HDU 1724 Ellipse 自适应simpson积分

    simpson公式是用于积分求解的比较简单的方法(有模板都简单…… 下面是simpson公式(很明显 这个公式的证明我并不会…… (盗图…… 因为一段函数基本不可能很规则 所以我们要用自适应积分的方法 ...

  4. HDU 1724 Ellipse (自适应辛普森积分)

    题目链接:HDU 1724 Problem Description Math is important!! Many students failed in 2+2's mathematical tes ...

  5. HDU 1724:Ellipse(自适应辛普森积分)

    题目链接 题意 给出一个椭圆,问一个[l, r] 区间(蓝色区域)的面积是多少. 思路 自适应辛普森积分 具体一些分析如上. 很方便,套上公式就可以用了. 注意 eps 的取值影响了跑的时间,因为决定 ...

  6. HDU 1724 自适应辛普森法

    //很裸的积分题,直接上模板 #include<stdio.h> #include<math.h> int aa, bb; //函数 double F(double x){ - ...

  7. csu 1806 & csu 1742 (simpson公式+最短路)

    1806: Toll Time Limit: 5 Sec  Memory Limit: 128 MB  Special JudgeSubmit: 256  Solved: 74[Submit][Sta ...

  8. simpson公式求定积分(模板)

    #include<cstdio> #include<cmath> #include <algorithm> using namespace std; double ...

  9. HDU - 2222,HDU - 2896,HDU - 3065,ZOJ - 3430 AC自动机求文本串和模式串信息(模板题)

    最近正在学AC自动机,按照惯例需要刷一套kuangbin的AC自动机专题巩固 在网上看过很多模板,感觉kuangbin大神的模板最为简洁,于是就选择了用kuangbin大神的模板. AC自动机其实就是 ...

随机推荐

  1. JSP向后台传 递 参 数 的四种方式

    一.通过Form表单提交传值 客户端通过Form表单提交到服务器端,服务器端通过 Java代码 request.getParameter(String xx); 来取得参数(xx)为参数名称.通过ge ...

  2. ifconfig命令为centos linux系统配置临时的局域名IP、网关以及子网掩码

    ifconfig eth0 192.168.1.25 netmask 255.255.255.0 broadcast 192.168.1.1 up netmask:子网掩码broadcast:默认网关

  3. JQ效果 透明图片覆盖动画

    效果图呈上 先说思路 1,一个固定的框架,有两张图片,一张是狗狗的,一张是练习方式,想把做好的练习方式隐藏 2,效果上想要从下面滑动出来,所以透明框定位在下面 3,整理需要的东西,缓慢升起需要动画效果 ...

  4. P1561 [USACO12JAN]爬山Mountain Climbing

    P1561 [USACO12JAN]爬山Mountain Climbing 题目描述 Farmer John has discovered that his cows produce higher q ...

  5. MySQL Daemon failed to start错误解决办法是什么呢?

    首先我尝试用命令:service mysql start 来启动服务,但是提示: MySQL Daemon failed to start 一开始出现这个问题我很方,然后开始查,说什么的都有,然后看到 ...

  6. 验证python中函数传参是引用传递

    定义: 值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数. 引用传递(pass by reference)是指在 ...

  7. golang之switch

  8. SQL Server新增用户并控制访问权限设置。

    新增用户: 一.进入数据库:[安全性]—>[登录名]—>[新建登录名] 二.在常规选项卡中.如图所示,创建登录名.注意设置默认的数据库. 三.在[用户映射]下设置该用户所能访问的数据库.并 ...

  9. ls command not found

    编辑profile文件没有写正确,导致在命令行下 ls等命令不能够识别. 在命令行下打入下面这段就可以了 export PATH=/usr/local/sbin:/usr/local/bin:/sbi ...

  10. java memory allocation(转)

    Java的运行时数据存储机制 Java程序在运行时需要为一系列的值或者对象分配内存,这些值都存在什么地方?用什么样的数据结构存储?这些数据结构有什么特点?本文试图说明此命题的皮毛之皮毛. 概念   对 ...