给定二次曲线上三个点,求这三个点和曲线构成部分的面积。可能我的想法比较麻烦,因为交完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;
}