[hdu 1071]The area 高斯消元

本文介绍了一种通过高斯消元法解决给定图像中土地面积计算问题的方法,包括输入处理、坐标计算及面积求解,并提供了一个实际样例的解答过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
  
2 5.000000 5.000000 0.000000 0.000000 10.000000 0.000000 10.000000 10.000000 1.000000 1.000000 14.000000 8.222222
 

Sample Output
  
33.33 40.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);
	} 
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值