hdu acm-step 2.1.7 The area
本题题意:依次给出3个点P1,P2,P3,其中P2,P3是抛物线与直线的交点,P1是抛物线的顶点,求抛物线与直线的面积。
代码如下:
#include <cstdio> using namespace std; struct Node { double x,y; }; Node s[3]; double Lagrange(Node s[],int n,double &a,double &b,double &c) { int t1,t2,t3,d,p,q; for(int i=0;i<n;i++) { t1 = i; t2 = (i+1)%3; t3 = (i+2)%3; d = (s[t1].x-s[t3].x)*(s[t1].x-s[t2].x); p = s[t2].x*s[t3].x; q = s[t2].x+s[t3].x; a+=s[t1].y/d; b+=-s[t1].y*q/d; c+=s[t1].y*p/d; } } int main() { int T; scanf("%d",&T); while(T--) { double a=0,b=0,c=0; for(int i=0;i<3;i++)scanf("%lf%lf",&s[i].x,&s[i].y); Lagrange(s,3,a,b,c); double s1 = a/3 * (s[1].x * s[1].x * s[1].x - s[2].x * s[2].x * s[2].x) + b*0.5*(s[1].x*s[1].x-s[2].x*s[2].x) + c*(s[1].x - s[2].x); double s2 = (s[1].x - s[2].x) * (s[1].y + s[2].y) * 0.5; printf("%.2lf\n",s2 - s1); } return 0; }
感觉又写了个垃圾代码....
不过还是学到了点东西,这个最重要...
求抛物线方程用的是拉格朗日插值法,通过三点确定一个一元二次方程...
直线面积直接用梯形公式求了,然后两式相减就是结果了(注意正负)。