[hdu 1071]The area 高斯消元

来源:互联网 发布:如何提升淘宝宝贝权重 编辑:程序博客网 时间:2024/06/05 20:57

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

The area

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 7352    Accepted Submission(s): 5144


Problem Description
Ignatius bought a land last week, but he didn't know the area of the land because the land is enclosed by a parabola and a straight line. The picture below shows the area. Now given all the intersectant points shows in the picture, can you tell Ignatius the area of the land?

Note: The point P1 in the picture is the vertex of the parabola.


 

Input
The input contains several test cases. The first line of the input is a single integer T which is the number of test cases. T test cases follow.
Each test case contains three intersectant points which shows in the picture, they are given in the order of P1, P2, P3. Each point is described by two floating-point numbers X and Y(0.0<=X,Y<=1000.0).
 

Output
For each test case, you should output the area of the land, the result should be rounded to 2 decimal places.
 

Sample Input
25.000000 5.0000000.000000 0.00000010.000000 0.00000010.000000 10.0000001.000000 1.00000014.000000 8.222222
 

Sample Output
33.3340.69
Hint
For float may be not accurate enough, please use double instead of float.
 


看了好多人的题解,发现基本上都是用公式做的,其实有一种不太用动脑子的方法就是高斯消元,通过抛物线上的三点,确定抛物线的a b c三值(二次多项式用三点确定),通过直线两点(一次多项式用两点确定),确定直线的斜率和截距。直接带入积分即可。


#include <cstdio>  #include <cstring>  #include <cstdlib>#include <cmath>#include <map>#include <algorithm>using namespace std;typedef double Matrix[5][5];Matrix A;void guass(Matrix A, int n){int i,j,k,r;for (i=0;i<n;i++){r=i;for (j=i+1;j<n;j++)if (fabs(A[j][i])>fabs(A[r][i])) r=j;if (r!=i)for (j = 0; j<=n;j++) swap(A[r][j],A[i][j]);for (k=i+1;k<n;k++){double f = A[k][i]/A[i][i];for (j=1;j<=n;j++)A[k][j]-=f*A[i][j];}}for (i=n-1;i>=0;i--){for (j=i+1;j<n;j++)A[i][n]-=A[j][n]*A[i][j];A[i][n]/=A[i][i];}}int main(){int T;double p;double a1,b1,c1,a2,b2;double x1,y1,x2,y2,x3,y3;scanf("%d",&T);while (T--){scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3);if (x2==x3) {swap(x1,y1);swap(x2,y2);swap(x3,y3);}A[0][0]=x1*x1;A[0][1]=x1;A[0][2]=1;A[1][0]=x2*x2;A[1][1]=x2;A[1][2]=1;A[2][0]=x3*x3;A[2][1]=x3;A[2][2]=1;A[0][3]=y1;A[1][3]=y2;A[2][3]=y3;guass(A,3);a1=A[0][3];b1=A[1][3];c1=A[2][3];A[0][0]=x2;A[0][1]=1;A[1][0]=x3;A[1][1]=1;A[0][2]=y2;A[1][2]=y3;guass(A,2);a2=A[0][2];b2=A[1][2];if (x2>x3) swap(x2,x3);double ans=(x3*x3*x3-x2*x2*x2)/3*a1+(x3*x3-x2*x2)/2*(b1-a2)+(x3-x2)*(c1-b2);printf("%.2f\n",ans);} }


0 0
原创粉丝点击