题目大意:
一个轴线与x轴平行的圆锥,高为H,底面直径为D(1 ≤ H, D ≤ 1000,且都为浮点数(double型的)),里面装满水,现从中放出体积为V的水(V小于体积的一半),现要求出剩余在圆锥中的水离x轴有多高。
现有多个测例(测例数题中给出),每个测例都给出H、D、V,对于每个测例都求出剩余水的高度,要求结果四舍五入到小数点后5位。
注释代码:
/*
* Problem ID : POJ 3929 Timer
* Author : Lirx.t.Una
* Language : C
* Run Time : 0 ms
* Run Memory : 176 KB
*/
#include <stdio.h>
#include <math.h>
#define EPS 1E-8
//沙漏的高,底面直径以及露出的水的体积
double h, d, v;
double r;//底面半径
double
getv(double s) {//利用微积分公式求得
//如果底面上下楼高度为s所得到的露出的水的体积v
//显而易见,getv根据s单调递增
//因此可以在一定区间内二分逼近
double _h;
_h = r - s;
return h * r * r * acos(_h / r) / 3.0 -
_h * h * sqrt(r * r - _h * _h) * 2.0 / 3.0 +
_h * _h * _h * h / r * log(( r + sqrt(r * r - _h * _h) ) / _h) / 3.0;
}
int
main() {
int t;//测例个数
double lft, rht, mid;//二分区间以及中间值
scanf("%d", &t);
while ( t-- ) {
scanf("%lf%lf%lf", &h, &d, &v);
r = d / 2.0;//求半径
//初始区间
lft = 0.0;
rht = r;//题中说过下最大长度为r
while ( rht - lft > EPS ) {//二分逼近
mid = ( lft + rht ) / 2.0;
if ( getv(mid) < v ) lft = mid;
else rht = mid;
}
printf("%.5lf\n", d - ( lft + rht ) / 2.0);//最后输出沙漏中剩余的高度
}
return 0;
}
无注释代码:
#include <stdio.h>
#include <math.h>
#define EPS 1E-8
double h, d, v;
double r;
double
getv(double s) {
double _h;
_h = r - s;
return h * r * r * acos(_h / r) / 3.0 -
_h * h * sqrt(r * r - _h * _h) * 2.0 / 3.0 +
_h * _h * _h * h / r * log(( r + sqrt(r * r - _h * _h) ) / _h) / 3.0;
}
int
main() {
int t;
double lft, rht, mid;
scanf("%d", &t);
while ( t-- ) {
scanf("%lf%lf%lf", &h, &d, &v);
r = d / 2.0;
lft = 0.0;
rht = r;
while ( rht - lft > EPS ) {
mid = ( lft + rht ) / 2.0;
if ( getv(mid) < v ) lft = mid;
else rht = mid;
}
printf("%.5lf\n", d - ( lft + rht ) / 2.0);
}
return 0;
}
单词解释:
decimal:adj, 小数的; n, 小数
round off ... to xth place:将...四舍五入到小数点后第x位
volume:n, 体积
diameter:n, 直径
figure out:vt, 解决,算出,想出
sacred:adj, 神圣的,庄严的
pull out:vt, 拔出
plug:n, 插头,塞子,栓
tip:n, 尖端,顶端
timer:n, 计时器
manual:n, 手册,指南
parallel to:vt, 与...平行
axis:n, 轴,轴线,轴心国
horizontal:adj, 水平的; n, 水平线
bottom:n, 底部,末端
transparent:adj, 透明的
container:n, 容器,集装箱
cone:n, 圆锥体,圆锥形
relic:n, 古代遗迹,遗物
archaeologist:n, 考古学家