这个题,是我请教包子学姐,让她帮我导出公式,然后做的。。。
题意:给你三个点p1、p2、p3,这三个点可以确定一个抛物线,p1是顶点,p2和p3确定一条直线。问你抛物线与直线围成的面积。
解法:中学+大学的数学。先求出抛物线的三个参数 a、b、c,再求出直线的参数 k t 之后手写积分,最后输出结果。求参数的方法是包子写的,有学姐真好。。。
#include <iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<queue>
#include<cmath>
#include<vector>
#define inf 0x3f3f3f3f
#define Inf 0x3FFFFFFFFFFFFFFFLL
#define pi acos(-1.0)
#define eps 1e-8
using namespace std;
struct Point
{
double x, y;
Point(double x=0, double y=0):x(x),y(y) {}
bool read() {scanf("%lf%lf",&x,&y);return true;}
};
//主函数
int main()
{
//freopen("in.txt","r",stdin);
double a, b, c;
int t; scanf("%d", &t);
while(t--)
{
Point p1, p2, p3;
p1.read(); p2.read(); p3.read();
double a = (p2.y-p1.y)/(p2.x-p1.x)/(p2.x-p1.x);
double b = -2*a*p1.x;
double c = p1.y+a*p1.x*p1.x;
double k = (p3.y-p2.y)/(p3.x-p2.x);
double t = p2.y - k * p2.x;
double area = a/3*(p3.x*p3.x*p3.x-p2.x*p2.x*p2.x) + (b-k)/2*(p3.x*p3.x-p2.x*p2.x)+(c-t)*(p3.x-p2.x);
printf("%.2lf\n",area);
}
return 0;
}