因为痛,所以叫青春

我有一个梦想:穷屌丝变身富屌丝
HDOJ 1071
View Code
Problem Description

 Ignatius bought a land last week, but he didn't know the area of the land because the land is enclosed by a parabola and a straight line. The picture below shows the area. Now given all the intersectant points shows in the picture, can you tell Ignatius the area of the land?

Note: The point P1 in the picture is the vertex of the parabola.




 
Input

 The input contains several test cases. The first line of the input is a single integer T which is the number of test cases. T test cases follow.
Each test case contains three intersectant points which shows in the picture, they are given in the order of P1, P2, P3. Each point is described by two floating-point numbers X and Y(0.0<=X,Y<=1000.0).
 

Output

 For each test case, you should output the area of the land, the result should be rounded to 2 decimal places.
 

Sample Input

2
5.000000 5.000000
0.000000 0.000000
10.000000 0.000000
10.000000 10.000000
1.000000 1.000000
14.000000 8.222222

 Sample Output

33.33
40.69

 Hint

 For float may be not accurate enough, please use double instead of float
#include<stdio.h>
#include<math.h>
int main()
{
    int T;
    double x1, x2, x3, y1, y2, y3, a, b, c, s;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3);
        a = ((y2-y1)*(x3-x2)/(x2-x1)-(y3-y2))/((x2*x2-x1*x1)*(x3-x2)/(x2-x1)-(x3*x3-x2*x2));
        b = ((y2-y1)-a*(x2*x2-x1*x1))/(x2-x1);
        c = y1-a*x1*x1-b*x1;
        s = (a/3*x3*x3*x3+b/2*x3*x3+c*x3)-(a/3*x2*x2*x2+b*x2*x2/2+c*x2)-(y3+y2)*(x3-x2)/2;
        printf("%.2lf\n",s);
    }
    return 0;
}

比赛的时候这道题目我只用了不到十分钟,读题加AC不到十分钟,其实它很简单,很普通的算术题,没有任何算法在里面,看到大家都不去做这道题,我觉得可能是大家在研究算法的时候慢慢忽略了数学这一领域了吧,遇到高中时就滚瓜烂熟的数学题,却不敢去解了。我的算法学的不好,但是却时常会在题目中考虑是不是可以用数学的知识解答,而且很多题目中确实只用到数学理论就可以通过,但是算法中却没有这些。

posted on 2012-08-07 10:06  Nice!  阅读(343)  评论(0编辑  收藏  举报