Cup
Time Limit:20000MS Memory Limit:32768K
这是2009武汉区域赛的热身赛试题的第一题,后面一个系列的还有好几题。- 题目的意思是:有一个杯子,可以看做是一个上大底小的圆台,圆台的上下面的半径和高度给出,还给出了现有水的体积,要求计算出水面到杯底的高度。
- 这题的思路比较明显,就是很简单的二分,下限是0,上限是H(给出的杯子的高度)。先写一个计算圆台体积的函数,调用起来比较方便。
#include <iostream> #include <cmath> #define Pi acos(-1) using namespace std; double V(double r,double R,double h) { return Pi*h*(R*R+R*r+r*r)/3.0; } double bin(double r,double R,double H,double v) { double a=0.0,b=H,mid; while(b-a>1e-8) { mid =( a + b ) / 2.0; if(v-V(r,r+mid/H*(R-r),mid)<0.0) b = mid; else a = mid; } return (a+b)/2.0; } int main() { int test; double r,R,H,v; cin >> test; while(test--) { cin >> r >> R >> H >> v; printf("%.6lf\n",bin(r,R,H,v)); } return 0; }