hdoj1071

給定二次曲線上三個點,求這三個點和曲線構成部分的面積。可能我的想法比較麻煩,因爲交完1500多B,然後看榜前面都是200多B。

思路:根據克萊默法則求出二次曲線係數a,b,c,然後求一個積分值。注意一點就是c++中控制格式輸出是頭文件<iomanip>。然後設置位數是setw(),設置小數點位數是setprecision()。代碼如下:

// hdu1071.cpp : 定義控制檯應用程序的入口點。
// Accepted

#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <iomanip>
#include <cmath>
#include <vector>

using namespace std;

//3*3行列式
double det(const vector<vector<double> > &v)
{
	double ans;
	ans = v[0][0] * v[1][1] * v[2][2] + v[1][0] * v[2][1] * v[0][2] + v[0][1] * v[1][2] * v[2][0] -
		v[0][2] * v[1][1] * v[2][0] - v[0][1] * v[1][0] * v[2][2] - v[1][2] * v[2][1] * v[0][0];
	return ans;
}

//求積分值
double area_solve(double a, double b, double c, double x2, double y2,double x3,double y3)
{
	double trapezium_area = (fabs(y2) + fabs(y3)) / 2.0*fabs(x2 - x3); //梯形面積
	double curve_area = fabs((1.0 / 3.0*a*x2*x2*x2 + 1.0 / 2.0*b*x2*x2 + c*x2) -
	(1.0 / 3.0*a*x3*x3*x3 + 1.0 / 2.0*b*x3*x3 + c*x3)); //曲線下面積

	double area = fabs(curve_area - trapezium_area);
	return area;
						
}

int main()
{
	int T;
	cin >> T;
	double x1, y1, x2, y2, x3, y3; //p1爲頂點
	while (T--)
	{
		cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3;
		
		vector<vector<double> > v = { { x1*x1,x1,1 },{ x2*x2,x2,1 },{ x3*x3,x3,1 } };
		double D = det(v);
		
		vector<vector<double> >v1 = { { y1,x1,1 },{ y2,x2,1 },{ y3,x3,1 } };
		double D1 = det(v1);

		vector<vector<double> >v2 = { { x1*x1,y1,1 },{ x2*x2,y2,1 },{ x3*x3,y3,1 } };
		double D2 = det(v2);

		vector<vector<double> >v3 = { { x1*x1,x1,y1 },{ x2*x2,x2,y2 },{ x3*x3,x3,y3 } };
		double D3 = det(v3);

		double a = D1 / D;
		double b = D2 / D;
		double c = D3 / D;

		//控制小數點位數
		cout <<  fixed << setprecision(2) << area_solve(a, b, c, x2, y2, x3, y3)<<endl;


	}
	system("pause");
	return 0;
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章