【题目链接】
ybt 1438:灯泡
洛谷 P5931 [清华集训2015] 灯泡
【题目考点】
1. 三分 求函数极值
2. 相似三角形
3. 对钩函数
【解题思路】
首先考虑影子还没有到达对面墙壁的情况
记BM长度为x,影子为AM,长度为L。三角形ABC相似于三角形AMN。因此有:
A
M
A
B
=
N
M
C
B
\frac{AM}{AB}=\frac{NM}{CB}
ABAM=CBNM
L
x
+
L
=
h
H
\frac{L}{x+L} = \frac{h}{H}
x+LL=Hh
h
x
+
h
L
=
L
H
hx+hL=LH
hx+hL=LH
h
x
=
L
(
H
−
h
)
hx=L(H-h)
hx=L(H−h)
L
=
h
H
−
h
x
L=\frac{h}{H-h}x
L=H−hhx
随着x的增大,L增大。在影子只在地面上的前提下,x最大时,
x
+
L
=
D
x+L=D
x+L=D
由于
x
=
H
−
h
h
L
x=\frac{H-h}{h}L
x=hH−hL
所以
D
=
x
+
L
=
H
−
h
h
L
+
L
=
H
h
L
D=x+L=\frac{H-h}{h}L+L=\frac{H}{h}L
D=x+L=hH−hL+L=hHL
L
=
h
H
D
L=\frac{h}{H}D
L=HhD
此时
x
=
D
−
L
=
H
−
h
H
D
x=D-L=\frac{H-h}{H}D
x=D−L=HH−hD
即当影子只在地面上时,当
x
=
H
−
h
H
D
x=\frac{H-h}{H}D
x=HH−hD时,影子长度最大,为
L
=
h
H
D
L=\frac{h}{H}D
L=HhD。
当影子可以打到墙壁上时
MA和AE都是影子,影子总长为L。
其中BM为x,x最小为
x
=
H
−
h
H
D
x=\frac{H-h}{H}D
x=HH−hD。MA为D-x,因此墙壁上影子长度
A
E
=
L
−
D
+
x
AE=L-D+x
AE=L−D+x
三角形EGN和三角形EFC相似,因此
N
G
C
F
=
E
G
E
F
\frac{NG}{CF}=\frac{EG}{EF}
CFNG=EFEG
N
M
−
M
G
C
B
−
B
F
=
E
G
E
F
\frac{NM-MG}{CB-BF}=\frac{EG}{EF}
CB−BFNM−MG=EFEG
h
−
L
+
D
−
x
H
−
L
+
D
−
x
=
D
−
x
D
\frac{h-L+D-x}{H-L+D-x}=\frac{D-x}{D}
H−L+D−xh−L+D−x=DD−x
D
h
−
D
L
+
D
2
−
D
x
=
D
H
−
D
L
+
D
2
−
D
x
−
H
x
+
L
x
−
D
x
+
x
2
Dh-DL+D^2-Dx=DH-DL+D^2-Dx-Hx+Lx-Dx+x^2
Dh−DL+D2−Dx=DH−DL+D2−Dx−Hx+Lx−Dx+x2
D
h
=
D
H
−
H
x
+
L
x
−
D
x
+
x
2
Dh=DH-Hx+Lx-Dx+x^2
Dh=DH−Hx+Lx−Dx+x2
L
x
=
−
x
2
+
(
H
+
D
)
x
+
D
h
−
D
H
Lx=-x^2+(H+D)x+Dh-DH
Lx=−x2+(H+D)x+Dh−DH
L
=
−
x
−
D
(
H
−
h
)
x
+
H
+
D
L=-x-\frac{D(H-h)}{x}+H+D
L=−x−xD(H−h)+H+D
记
f
(
x
)
=
−
x
−
D
(
H
−
h
)
x
+
H
+
D
f(x)=-x-\frac{D(H-h)}{x}+H+D
f(x)=−x−xD(H−h)+H+D,
x
∈
[
H
−
h
H
D
,
D
]
x\in [\frac{H-h}{H}D, D]
x∈[HH−hD,D]
该函数是对钩函数,在
x
∈
[
0
,
+
∞
]
x\in [0, +\infty]
x∈[0,+∞]范围内会先单调递增,再单调递减,也就是单峰函数。
对f(x)求导,得: f ′ ( x ) = D ( H − h ) x 2 − 1 f'(x)=\frac{D(H-h)}{x^2}-1 f′(x)=x2D(H−h)−1
求 x ∈ [ 0 , + ∞ ] x\in [0, +\infty] x∈[0,+∞]中的极值点,使 D ( H − h ) x 2 − 1 = 0 \frac{D(H-h)}{x^2}-1=0 x2D(H−h)−1=0, x 0 = D ( H − h ) x_0=\sqrt{D(H-h)} x0=D(H−h)
当 x < x 0 x<x_0 x<x0时, f ′ ( x ) > 0 f'(x)>0 f′(x)>0,函数单调递增
当 x > x 0 x>x_0 x>x0时, f ′ ( x ) < 0 f'(x)<0 f′(x)<0,函数单调递减
当 x = x 0 x=x_0 x=x0时, f ′ ( x ) = 0 f'(x)=0 f′(x)=0,函数有极值点。
由于
f
(
x
)
f(x)
f(x)在
x
∈
[
0
,
+
∞
]
x\in [0, +\infty]
x∈[0,+∞]范围内是单峰函数,那么在其子区间
x
∈
[
H
−
h
H
D
,
D
]
x\in [\frac{H-h}{H}D, D]
x∈[HH−hD,D]内,
f
(
x
)
f(x)
f(x)可以是单调函数或单峰函数。
接下来有两种方法:
解法1:三分
- 如果f(x)是单峰函数,使用三分算法可以求出函数的极大值,也是最大值。
- 如果f(x)是单调函数,使用与上述相同的三分算法可以求出函数的最大值。
因此,使用三分算法求出 f ( x ) f(x) f(x)在区间 x ∈ [ H − h H D , D ] x\in [\frac{H-h}{H}D, D] x∈[HH−hD,D]中的最大值,就是L的最大值。
解法2:数学求函数区间最值
已知 f ( x ) = − x − D ( H − h ) x + H + D f(x)=-x-\frac{D(H-h)}{x}+H+D f(x)=−x−xD(H−h)+H+D在 x ∈ [ 0 , + ∞ ] x\in [0, +\infty] x∈[0,+∞]范围内是单峰函数,极值点 x 0 = D ( H − h ) x_0=\sqrt{D(H-h)} x0=D(H−h),要想求的是 x ∈ [ H − h H D , D ] x\in [\frac{H-h}{H}D, D] x∈[HH−hD,D]中的最大值。
- 如果 x 0 < H − h H D x_0< \frac{H-h}{H}D x0<HH−hD,那么函数在 [ H − h H D , D ] [\frac{H-h}{H}D, D] [HH−hD,D]范围内是单调递减的,最大值点是 H − h H D \frac{H-h}{H}D HH−hD,最大值是 f ( H − h H D ) = h H D f(\frac{H-h}{H}D)=\frac{h}{H}D f(HH−hD)=HhD
- 如果 x 0 > D x_0> D x0>D,那么函数在 [ H − h H D , D ] [\frac{H-h}{H}D, D] [HH−hD,D]范围内是单调递增的,最大值点是 D D D,最大值是 f ( D ) = h f(D)=h f(D)=h
- 如果 H − h H D ≤ x 0 ≤ D \frac{H-h}{H}D\le x_0 \le D HH−hD≤x0≤D,那么函数在 [ H − h H D , D ] [\frac{H-h}{H}D, D] [HH−hD,D]范围内是单峰函数,最大值点就是极大值点 x 0 x_0 x0,最大值为 f ( x 0 ) = H + D − 2 D ( H − h ) = H + D − 2 x 0 f(x_0)=H+D-2\sqrt{D(H-h)}=H+D-2x_0 f(x0)=H+D−2D(H−h)=H+D−2x0
【题解代码】
解法1:三分
#include<bits/stdc++.h>
using namespace std;
double H, h, D;
double f(double x)
{
return -x-D*(H-h)/x+H+D;
}
int main()
{
int t;
cin >> t;
while(t--)
{
cin >> H >> h >> D;
double l = (H-h)*D/H, r = D;
while(r-l > 1e-10)
{
double lm = l+(r-l)/3, rm = r-(r-l)/3;
if(f(lm) < f(rm))
l = lm;
else
r = rm;
}
cout << fixed << setprecision(3) << f(l) << endl;
}
return 0;
}
解法2:数学求函数区间最值
#include<bits/stdc++.h>
using namespace std;
int main()
{
double H, h, D, ans;
int t;
cin >> t;
while(t--)
{
cin >> H >> h >> D;
double x0 = sqrt(D*(H-h));
if(x0 < (H-h)*D/H)
ans = h*D/H;
else if(x0 > D)
ans = h;
else
ans = H+D-2*x0;
cout << fixed << setprecision(3) << ans << endl;
}
return 0;
}