2019.11.17日常总结兼灯泡题解

【闲话】

今天是 C S P CSP 1 1 届第 2 2 轮考试的后 1 1 天,突然发现好多本地的改革都撞上我们这一届了,我们什么运气……

【正题】

【来源】: 清华集训 2015 2015 ,一本通 1438 1438 Z j o i 3203 Zjoi3203
【题目大意】: 相比起Wildleopard家,他弟弟Mildeopard比较穷。他(弟弟)的房子是狭窄的,而且只有一盏灯,他发现他影子的长度随他在灯泡和墙壁间走动而变化。求影子长度的最大值。
在这里插入图片描述
【输入格式】: ( 1 ) . (1). 1 1 1 1 个数 t e s t n u m b e r testnumber ,表示组数。
( 2 ) . (2). 2 2 t e s t n u m b e r testnumber 行,每行三个数, H , h , D H,h,D ,含义如上
【输出格式】: t e s t n u m b e r testnumber 行,每行一个数 L L ,含义如上
【样例】:

输入:                                                     输出:
3                                                         1.000
2 1 0.5                                                   0.750
2 0.5 3                                                   4.000
4 3 4

【思路】:
首先这题的长度是一个单峰函数,所以可以用三分法解决,问题变成了给定一个数 m i d mid ,求Mildeopard在位置 ( m i d , 0 ) (mid,0) 时影子长度 f ( m i d ) f(mid)

首先求光线的函数解析式,已知光线经过 ( 0 , H ) (0,H) ( m i d , D ) (mid,D) ,分别是灯泡的位置和Mildeopard头顶的位置,那么根据 y = k x + b y=kx+b 可求出 k = h H m i d , b = H k=\frac{h-H}{mid},b=H ,所以光线和地面的交点的 x x 坐标即为 L = H × m i d H h L=\frac{H \times mid}{H-h}

L < D L<D 时,影子长度即为 L L ,否则即影子在墙上的高度为 L 1 L_1 ,光线经过点 ( D , L 1 ) (D,L_1) ,所以 L 1 = D × h H m i d + H L_1=D \times \frac{h-H}{mid}+H ,影子长度即为 D m i d + L 1 = D m i d + D × h H m i d + H D-mid+L_1=D-mid+D \times \frac{h-H}{mid}+H
【代码】:

int test_number;
double H,h,D;
double lmid,rmid,l,r;
const double eps=1e-5;
inline double f(double mid){
	if (mid==0.0) return 0.0;
	register double L=(H*mid/(H-h));
	if (L<D) return L-mid;
	return D-mid+D*(h-H)/mid+H;
}
int main(){
	freopen("t1.in","r",stdin);
	scanf("%d",&test_number);
	while (test_number--){
		scanf("%lf%lf%lf",&H,&h,&D);
		l=0;r=D;
		while (r-l>eps){
			lmid=l+(r-l)/3.0;
			rmid=r-(r-l)/3.0;
			if (f(lmid)<f(rmid)) l=lmid;
			else r=rmid;
		}
		printf("%.3lf\n",f(l));
	}
	return 0;
}

【小结】: 数学学得好, O I OI 也受益!!!

发布了82 篇原创文章 · 获赞 4 · 访问量 1786

猜你喜欢

转载自blog.csdn.net/ZHUYINGYE_123456/article/details/103113168