給定二次曲線上三個點,求這三個點和曲線構成部分的面積。可能我的想法比較麻煩,因爲交完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;
}