http://acm.hdu.edu.cn/showproblem.php?pid=1071

解一个给定三个点的坐标二次函数某区域的积分值。

设出方程之后高斯消元得到二次函数。然后再消元得到直线。

两次积分然后相减就可以了。

把自适应辛普森改成了传入函数指针的形式,有点多此一举。

可以这样做的原因,是因为这道题保证要求的区域都是在第一象限,否则不能直接定积分。

语言:G++

#include<bits/stdc++.h>
using namespace std;
typedef long long ll; namespace Gauss_Jordan_Elimination {
const int MAXN=10;
double a[MAXN][MAXN],del;
double ans[MAXN]; const double eps=1e-8; bool gauss_jordan(int n) {
for(int i=1; i<=n; i++) {
int mx=i;
for(int j=i+1; j<=n; j++)
if(fabs(a[j][i])>fabs(a[mx][i]))
mx=j;
for(int j=1; j<=n+1; j++)
swap(a[i][j],a[mx][j]);
if(fabs(a[i][i])<eps)
return false;
for(int j=1; j<=n+1; j++) {
if(j!=i) {
double tmp=a[j][i]/a[i][i];
for(int k=i+1; k<=n+1; k++) {
a[j][k]-=a[i][k]*tmp;
}
}
}
} for(int i=1; i<=n; i++)
ans[i]=a[i][n+1]/a[i][i]; return true;
}
} using namespace Gauss_Jordan_Elimination; double A,B,C,D,E; namespace Adaptive_Simpson_Integral { /* 备注:
1.直接往上面模板的f函数中输入本题给定函数,然后调用一次asr(l,r)即可。
2.可能需要修改精度要求,测试过至少取需求精度的100倍或1000倍就挺好。
*/ double seps=1e-8; double f(double x) {
//需要积分的函数
return A*x*x+B*x+C;
} double g(double x) {
//需要积分的函数
return D*x+E;
} double simpson(double l,double r,double (*F)(double)) {
double mid=(l+r)/2;
return (F(l)+4*F(mid)+F(r))*(r-l)/6;
} double asr(double l,double r,double A,double (*F)(double)) {
double mid=(l+r)/2;
double L=simpson(l,mid,F),R=simpson(mid,r,F);
if(fabs(L+R-A)<=15*seps)
return L+R+(L+R-A)/15.0;
return asr(l,mid,L,F)+asr(mid,r,R,F);
} double asr(double l,double r,double (*F)(double)) {
return asr(l,r,simpson(l,r,F),F);
} /* 备注:
1.直接往上面模板的F函数中输入本题给定函数,然后调用一次asr(l,r)即可。
2.可能需要修改精度要求,测试过至少取需求精度的100倍或1000倍就挺好。
*/ } using namespace Adaptive_Simpson_Integral; double x[3],y[3];
int main() {
int t;
scanf("%d",&t);
while(t--) {
scanf("%lf%lf%lf%lf%lf%lf",&x[0],&y[0],&x[1],&y[1],&x[2],&y[2]); for(int i=1; i<=3; i++) {
a[i][1]=x[i-1]*x[i-1];
a[i][2]=x[i-1];
a[i][3]=1;
a[i][4]=y[i-1];
} gauss_jordan(3);
A=ans[1],B=ans[2],C=ans[3];
//cout<<"A="<<A<<" B="<<B<<" C="<<C<<endl; for(int i=1; i<=2; i++) {
a[i][1]=x[i];
a[i][2]=1;
a[i][3]=y[i];
} gauss_jordan(2);
D=ans[1],E=ans[2];
//cout<<"D="<<D<<" E="<<E<<endl; double ans1=asr(x[1],x[2],f);
double ans2=asr(x[1],x[2],g);
printf("%.2f\n",ans1-ans2);
}
}

最新文章

  1. strstr函数的用法
  2. Tabular Model下的ADOMD.NET
  3. VC++6.0 Debug单步调试
  4. android实现点击背景图片不同区域实现不同事件
  5. Careercup - Google面试题 - 6283958983589888
  6. Intel XDK问题
  7. Mahalanobis Distance(马氏距离)
  8. MySQL 5.7.12新增MySQL Shell命令行功能
  9. MapReduce执行过程源码分析(一)&mdash;&mdash;Job任务的提交
  10. Xcode的小标记旁边的文件的名称的作用
  11. hdu1083二分图匹配模板题
  12. Sqoop Java API 导入应用案例
  13. 错误代码: 1248 Every derived table must have its own alias
  14. 使用 WTForms 进行表单验证的例子
  15. Spring拓展接口之BeanFactoryPostProcessor,占位符与敏感信息解密原理
  16. spring boot引入json,jsonobject,需要指定jdk15
  17. 洛谷 P1020 导弹拦截(dp+最长上升子序列变形)
  18. ubuntu18虚拟机克隆之后ip相同的解决方案
  19. python math random
  20. Java 集成开发环境的介绍及下载

热门文章

  1. PHP对称加密类
  2. 程序基石系列之C++多态的前提条件
  3. mongodb分页
  4. Kafka理论学习
  5. Hadoop安全
  6. ARM编译器中预定义的宏
  7. vue组件挂载到全局方法
  8. android DHCP流程【转】
  9. Package &#39;sun-java6-jdk&#39; has no installation candidate 解决方式【转】
  10. Codeforces Round #374 (Div. 2) C. Journey —— DP