Part1.2 基础算法-二分与三分
A. 愤怒的牛
问题描述
需要在 n n n 个点中选取 m m m 个放置牛,问你所有放置方法中任意两头牛的最大的最小距离是多少
解题思路
很容易想到该距离的上限是 m a x i = 1 n X i − m i n i = 1 n X i max_{i=1}^{n}X_{i}-min_{i=1}^{n}X_{i} maxi=1nXi−mini=1nXi,其下限为 0,那么我们可以二分这个答案
假设当前枚举的答案为 x x x,当前已将插入了 i − 1 i - 1 i−1 头牛,那么下一头牛的位置 X i X_{i} Xi 必定 ≥ X i − 1 + x \geq X_{i-1}+x ≥Xi−1+x,为了尽可能多的放置牛, X i X_{i} Xi 应当尽可能的小,所以下一头牛的位置 X i X_{i} Xi 应当为 ≥ X i − 1 + x \geq X_{i-1}+x ≥Xi−1+x 的最小位置
二分答案后贪心枚举答案的可行性,总时间复杂度 O ( n l o g 2 n ) O(nlog_{2}^{n}) O(nlog2n)
B. Best Cow Fences
问题描述
给定一个长度为 n n n 的非负整数序列 a a a,求一个平均数最大的,长度不小于 l l l 的子段
解题思路
显然当这个平均数很大时是不可行的,很小时一定可行,故可二分,设当前答案为 a v g avg avg,现在需要讨论该答案的可行性
假设所选区间为 [ L , R ] [L,R] [L,R],定义 s u m i = ∑ j = 1 i a j sum_{i}=\sum_{j=1}^{i}a_{j} sumi=∑j=1iaj
那么有 a v g [ L , R ] = s u m R − s u m L − 1 R − L + 1 avg_{[L,R]}=\frac{sum_{R}-sum_{L-1}}{R-L+1} avg[L,R]=R−L+1sumR−sumL−1
若该区间可行,则有:
a v g [ L , R ] ≥ a v g avg_{[L,R]}\geq avg avg[L,R]≥avg s u m R − s u m L − 1 R − L + 1 ≥ a v g \frac{sum_{R}-sum_{L-1}}{R-L+1}\geq avg R−L+1sumR−sumL−1≥avg s u m R − s u m L − 1 ≥ a v g × ( R − L + 1 ) sum_{R}-sum_{L-1} \geq avg \times (R-L+1) sumR−sumL−1≥avg×(R−L+1) s u m R − a v g × R ≥ s u m L − 1 − a v g × ( L − 1 ) sum_{R}-avg \times R \geq sum_{L-1}-avg \times(L-1) sumR−avg×R≥sumL−1−avg×(L−1)
且 L L L, R R R 需要满足 R − L + 1 ≥ l R-L+1 \geq l R−L+1≥l
定义 b i = s u m i − a v g × i b_{i}=sum_{i} - avg \times i bi=sumi−avg×i
那么若 m a x i = R n b i ≥ m i n i = 1 R − l + 1 b i max_{i=R}^{n}b_{i} \geq min_{i=1}^{R-l+1}b_{i} maxi=Rnbi≥mini=1R−l+1bi 则称 a v g avg avg 为合法答案
总时间复杂度 O ( n l o g 2 n ) O(nlog_{2}^{n}) O(nlog2n)
C. 曲线
问题描述
定义 S i ( x ) = a x 2 + b x + c S_{i}(x) = ax^{2}+bx+c Si(x)=ax2+bx+c, F ( x ) = m a x i = 1 n S i ( x ) F(x)=max_{i=1}^{n}S_{i}(x) F(x)=maxi=1nSi(x)
问你 F ( x ) F(x) F(x) 在区间 [ 0 , 1000 ] [0,1000] [0,1000] 上的最小值是多少
保证 a ≥ 0 a \geq 0 a≥0
解题思路
显然 F ( x ) F(x) F(x) 与 S i ( x ) S_{i}(x) Si(x) 都是先减再增的,直接三分 x x x,然后求解 S i ( x ) S_{i}(x) Si(x) 的最大值即可
F. 灯泡
问题描述
求解
L
L
L 的最大值
解题思路
则有:
H
−
h
h
′
=
x
D
⇒
h
′
=
D
(
H
−
h
)
x
\frac{H-h}{h'}=\frac{x}{D} \Rightarrow h'=\frac{D(H-h)}{x}
h′H−h=Dx⇒h′=xD(H−h)
L
=
H
−
h
′
+
x
=
H
−
D
(
H
−
h
)
x
+
x
L=H-h'+x=H-\frac{D(H-h)}{x}+x
L=H−h′+x=H−xD(H−h)+x
其中 D ( H − h ) H ≤ x ≤ D \frac{D(H-h)}{H} \leq x \leq D HD(H−h)≤x≤D
显然这是一个双曲函数,三分 x x x 求解其极值即可