不规则图形面积 boj1297

791阅读 0评论2010-01-01 jiangwen127
分类:嵌入式

Cylinder
Submit: 623   Accepted:152
Time Limit: 1000MS  Memory Limit: 65535K
Description
dreamzk每天上学时都会带上一个水杯去,他的水杯是一个半径为R高为L的圆柱形的,杯子里存有一定量的水,水面到底面的高度为H , 现把这个杯子倒过来并且水平放置<如图> ,dreamzk想计算出水平放置后水面的高度h,想请你帮帮他。


Input
多个测试用例,每个测试用例一行每行输入3个浮点数 0 < R <= 100.0 , 0 < L <= 100.0 , 0 <= H <= L


Output
对应每个测试用例输出一行h保留3位小数。
输出格式见Sample Output


Sample Input

5.000000 10.000000 5.000000
83.985632 15.216697 5.929504


Sample Output

Case 1:
5.000
Case 2:
69.356

做的不多的图形计算的题:
最开始以为这个题是要做积分!!
下面的思路是一个二分查找,无限逼近所求面积的一种方法,需要控制好精度。

所求的面积用圆面积减去三角形的面积就OK了。
三角形面积公式(高数的东西都忘了~~~还得花时间补补)
S = 1/2 * a * b * sin(alpha).  alpha是a,b两边之间的夹角!

#include 
#include 
#include 

#define PI acos(-1)
#define EXPS 1e-6

double R, L, H;

double cal_area(double y)
{
    double alpha, area;
    if (y < R)
    {
        alpha = acos((R - y) / R);
        area = alpha * R * R - 0.5 * R * R * sin(2.0 * alpha);
    }
    else
    {
        alpha = acos((y - R) / R);
        area = PI * R * R - (alpha * R * R - 0.5 * R * R * sin(2.0 * alpha));
    }
    return area;
}

int main(int argc, char *argv[])
{
    double v, s, high, low, mid, area;
    int i = 1;
    while (EOF != scanf("%lf %lf %lf", &R, &L, &H))
    {
        v = PI * R * R * H;
        s = v / (double)L;
        high = 2.0 * R;
        low = 0;
        while (1)
        {
            mid = (high + low) / 2.0;
            area = cal_area(mid);
            if (fabs(area - s) <= EXPS) /*满足这个精度就认为是相等了*/
                break;
            if (area > s) /* 二分之 */
                high = mid;
            else
                low = mid;
        }
        printf("Case %d:\n%.3lf\n", i++, mid);
    }
}
上一篇:枚举,排列 boj1082
下一篇:子数列(类似最长升序列) boj1004