构造系数矩阵,高斯消元求解二次函数,然后两点式求直线函数,带入辛普森积分法无脑AC。。。
#include<cstdio> #include<queue> #include<algorithm> #include<cstring> #include<vector> #include<cmath> using namespace std; struct node { double x,y; }p[4]; double g[10][10]; double f1(double x) //二次函数 { return g[0][3]*x*x+g[1][3]*x+g[2][3]; } double f2(double x) //直线两点式 { double y2=p[2].y,x2=p[2].x; double y1=p[1].y,x1=p[1].x; return (x-x1)/(x2-x1)*(y2-y1)+y1; } double f(double x) { return f1(x)-f2(x); } double simpson(double a,double b,int n) { double h=(b-a)/n; double ans=f(a)+f(b); for(int i=1;i<n;i+=2) ans+=4*f(a+i*h); for(int i=2;i<n;i+=2) ans+=2*f(a+i*h); return ans*h/3; } void Gauss(int cnt) { int i, j, k; double tmp, big; for (i = 0; i < cnt; i++) { for (big = 0, j = i; j < cnt; j++) { if (fabs(g[j][i]) > big) { big = fabs(g[j][i]); k = j; } } if (k != i) { for (j = 0; j <= cnt; j++) swap(g[i][j], g[k][j]); } for (j = i + 1; j < cnt; j++) { if (g[j][i]) { tmp = -g[j][i] / g[i][i]; for (k = i; k <= cnt; k++) g[j][k] += tmp * g[i][k]; } } } for (i = cnt - 1; i >= 0; i--) { for (j = i + 1; j < cnt; j++) g[i][cnt]-=g[j][cnt]*g[i][j]; g[i][cnt]/=g[i][i]; } } int main() { int cas; scanf("%d",&cas); while(cas--) { for(int i=0;i<3;i++) scanf("%lf%lf",&p[i].x,&p[i].y); for(int i=0;i<3;i++) { g[i][0]=p[i].x*p[i].x; //ax^2 g[i][1]=p[i].x; //bx g[i][2]=1; //c g[i][3]=p[i].y; //y } Gauss(3); // printf("%lfx^2+%lfx+%lf\n",g[0][3],g[1][3],g[2][3]); printf("%.2lf\n",simpson(p[1].x,p[2].x,1000)); } return 0; }
hdu 1071 The area 高斯消元求二次函数+辛普森积分
时间: 2024-10-12 23:40:14