Cup HDU - 2289 (二分 浮点)

题意: 给定一个上半径小于下半径的圆台和v体积的水, 求水装在圆台中时水面的高度(保留6位小数)

题解: 首先运用初中的数学知识, 我们通过分析可以知道下图两个三角形相似, 可得出(rr-br)/h = (tr-br)/H的结论, 从而只需要二分h即可
Cup HDU - 2289 (二分 浮点)

圆台的体积公式为
Cup HDU - 2289 (二分 浮点)

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
#define ms(x, n) memset(x,n,sizeof(x));
typedef  long long LL;
const LL maxn = 1e6+10;
const double eps = 1e-9;
const double pie = 3.1415926535;

int T;
double br, tr, H, v;
double getV(double h)
{
    double rr = (tr-br)*h/H+br; //相似三角形
    return pie*h*(br*br+rr*rr+br*rr)/3;
}
int main()
{
    scanf("%d",&T);
    while(T--){
        scanf("%lf%lf%lf%lf",&br,&tr,&H,&v);
        //二分查找水的高度
        double l = 0, r = H, mid, curV;
        while(r-l > eps){ //不要写成l-r <=

            mid = (l+r)/2, curV = getV(mid);
            if(fabs(curV-v) <= eps) break;
            else if(curV > v) r = mid;
            else l = mid;
        }
        printf("%.6lf\n",mid);
    }
	return 0;
}

相关文章: