Section 7.1.1

master
大蒟蒻 9 years ago
parent af8ec379df
commit 62aec8b1a8

@ -0,0 +1,22 @@
#include <cstdio>
#include <algorithm>
int n, m, a[100005];
bool check(int d)
{
int cow = 0, nxt = 0;
for (int i = 0; i < n; i++)
if (a[i] >= nxt)
cow++, nxt = a[i] + d;
return cow >= m;
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++) scanf("%d", a + i);
std::sort(a, a + n);
int L = 0, R = 0x3f3f3f3f, mid;
while (L < R)
check(mid = (L + R) >> 1) ? L = mid + 1 : R = mid;
printf("%d", L - 1);
return 0;
}

@ -0,0 +1,22 @@
#include <cstdio>
#include <algorithm>
int n, m, a[100005];
bool check(int d)
{
int cow = 0, nxt = 0;
for (int i = 0; i < n; i++)
if (a[i] >= nxt)
cow++, nxt = a[i] + d;
return cow >= m;
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++) scanf("%d", a + i);
std::sort(a, a + n);
int L = 0, R = 0x3f3f3f3f, mid;
while (L < R)
check(mid = (L + R) >> 1) ? L = mid + 1 : R = mid;
printf("%d", L - 1);
return 0;
}

@ -505,7 +505,10 @@ Manacher 模板题
\subparagraph{二分答案} \subparagraph{二分答案}
最小值最大或是最大值最小问题这类双最值问题常常使用二分法求解也就是确定答案后配合贪心或DP等其他算法来检验这个答案是否合法将最优化问题转变为判定性问题。例如将长度为$n$的序列$a_i$分成最多$m$个连续段,求所有分法中每段和的最大值最小能是多少。 最小值最大或是最大值最小问题这类双最值问题常常使用二分法求解也就是确定答案后配合贪心或DP等其他算法来检验这个答案是否合法将最优化问题转变为判定性问题。例如将长度为$n$的序列$a_i$分成最多$m$个连续段,求所有分法中每段和的最大值最小能是多少。
\subparagraph{二分查找} \subparagraph{二分查找}
具有单调性的布尔表达式求解分界点,比如在有序数列中求解数字 x 的排名。 具有单调性的布尔表达式求解分界点,比如在有序数列中求解数字$x$的排名。
\subparagraph{二分导数代替三分} \subparagraph{二分导数代替三分}
有时对于一些单峰函数,我们可以通过二分导函数的方法求解函数极值,这样使用时通常定义域为整数域比较方便,因为此时$dx$可以直接取整数$1$ 有时对于一些单峰函数,我们可以通过二分导函数的方法求解函数极值,这样使用时通常定义域为整数域比较方便,因为此时$dx$可以直接取整数$1$
\subparagraph{二分的例题} 我讨厌奶牛。
\codeinput[\href{http://poj.org/problem?id=2456}{POJ2456} - Aggressive cows]{assets/day7/poj2456.cpp}
你看,这次的答案就是\verb|L - 1|。
\end{document} \end{document}
Loading…
Cancel
Save