POJ 3929 Timer

题目大意:

        一个轴线与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, 考古学家

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值