HDOJ 1071 The area

感觉此题不错,很标准的数学题。用到了高中的抛物线和直线,大学的高等数学中的积分知识。

概念不清楚的只能去查相关资料了。这里把大概讲一下:(注意:下面的关系式不是按标准的计算机表示方法书写的,所以诸如乘号*都省略了)

已知抛物线与直线相交两点和抛物线顶点,顶点P1(-2a/b, (4ac-b^2)/4a)。

抛物线方程:y = ax^2 + bx + c;

直线方程:y = kx+h;

已知p1, p2, p3可以求出a, b, c, k, h

然后是高数中的积分求面积了。(我高数不过关,不过这些基本还是记得的。=。=)

积分符号不太好打出来,这里直接给出积分后的面积公式了。

S = a/3 *(x3^3 – x2 ^ 3) + (b-k)/2 * (x3^2 – x2^2) + (c-h)*(x3-x2);

这里求出来a是关键,求出了a,则b,c,k,h都可以直接求出来了。

而a这里我半天没想到,看到网上写 a = (y2-y1)/((x2-x1)^2)

半天不懂,后来逆推才发现的。

y1 = ax1^2 + bx1 + c

y2 = ax2^2 + bx2 + c

y1- y2 = (x1- x2)(a(x1+x2) + b)

又x1 = -b/2a,

所以

y2- y1 = (x1-x2)^2

好吧,感觉讲的很仔细了。

再就是贴代码了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// HDOJ 1071
// Author: Tanky Woo
 #include <iostream>
using namespace std;
 
typedef struct Co
{
    double x,y;
}Co;
 
Co p1, p2, p3;
// www.wutianqi.com
int main()
{
    //freopen("input.txt", "r", stdin);
    double a, b, c;   // 抛物线的参数
    double k, h;      // 直线的参数
    int nCases;
    scanf("%d", &nCases);
    while(nCases--)
    {
        scanf("%lf %lf", &p1.x, &p1.y);
        scanf("%lf %lf", &p2.x, &p2.y);
        scanf("%lf %lf", &p3.x, &p3.y);
 
        // 抛物线 y = ax^2 + bx + c
        a = (p2.y - p1.y) / ((p2.x - p1.x)*(p2.x - p1.x));   // a = (y2-y1) / (x2-x1)^2
        b = -2 * a * p1.x;    // b = -2a*x1;
        c = p1.y - a * p1.x * p1.x - b * p1.x;   // c = y - ax^2 - bx
        //直线 y = kx + h
        k = (p2.y - p3.y) / (p2.x - p3.x);
        h = p3.y - k * p3.x;
 
        double s = 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-h)*(p3.x-p2.x);
 
        printf("%.2lf\n", s);
    }
    return 0;
 
 
}

发布者

Tanky Woo

Tanky Woo,[个人主页:https://tankywoo.com] / [新博客:https://blog.tankywoo.com]

发表评论

电子邮件地址不会被公开。 必填项已用*标注