题意: 给定一个上半径小于下半径的圆台和v体积的水, 求水装在圆台中时水面的高度(保留6位小数)
题解: 首先运用初中的数学知识, 我们通过分析可以知道下图两个三角形相似, 可得出(rr-br)/h = (tr-br)/H的结论, 从而只需要二分h即可
圆台的体积公式为
#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;
}