[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.
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).
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.69HintFor 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
- [hdu 1071]The area 高斯消元
- hdu 1071 The area
- (hdu 1071)The area
- hdu 1071 The area
- hdu 1071 The Area
- HDU 1071 The area
- Hdu 1071 - The area
- HDU 1071 The area
- HDU 1071 The area
- hdu 1071 The area
- HDU 1071 The area
- hdu 1071 - The area
- hdu-1071 The area
- hdu 1071 The area
- The area (HDU 1071)
- hdu-1071-The area
- hdu 1071 The area
- HDU 1071 The area
- 黑马程序员——OC——ARC内存管理
- 规范定义的错误码
- 编程算法 - 连续子数组的最大和 代码(C)
- HTML文档类型
- 121_leetcode_Wildcard Matching
- [hdu 1071]The area 高斯消元
- js面对对象编程(二):属性和闭包
- ORACLE锁机制
- 依赖注入的方式
- 机器学习中的相似性度量
- 游戏中常用算法
- C语言的本质(3)——整数的本质与运算
- 用Java统计字符串中的字母、数字、空格和其他字符
- C语言的本质(4)——浮点数的本质与运算