Section 7.1

master
大蒟蒻 9 years ago
parent 62aec8b1a8
commit 644fffec53

@ -0,0 +1,25 @@
#include <cmath>
#include <cstdio>
const double pi = acos(-1.0), eps = 1e-6;
double S;
inline double calc(double r)
{
double l = (S - r * r) / r;
double h = sqrt(l * l - r * r);
return pi * r * r * h / 3;
}
int main()
{
while (~scanf("%lf", &S))
{
S /= pi;
double l = 0, r = sqrt(S), m1, m2, d;
while ((d = r - l) > eps)
calc(m1 = l + d / 3) < calc(m2 = r - d / 3) ? l = m1 : r = m2;
l = (S - r * r) / r;
double h = sqrt(l * l - r * r);
double V = pi * r * r * h / 3;
printf("%.2f\n%.2f\n%.2f\n", V, h, r);
}
return 0;
}

@ -0,0 +1,25 @@
#include <cmath>
#include <cstdio>
const double pi = acos(-1.0), eps = 1e-6;
double S;
inline double calc(double r)
{
double l = (S - r * r) / r;
double h = sqrt(l * l - r * r);
return pi * r * r * h / 3;
}
int main()
{
while (~scanf("%lf", &S))
{
S /= pi;
double l = 0, r = sqrt(S), m1, m2, d;
while ((d = r - l) > eps)
calc(m1 = l + d / 3) < calc(m2 = r - d / 3) ? l = m1 : r = m2;
l = (S - r * r) / r;
double h = sqrt(l * l - r * r);
double V = pi * r * r * h / 3;
printf("%.2f\n%.2f\n%.2f\n", V, h, r);
}
return 0;
}

@ -508,7 +508,18 @@ Manacher 模板题
具有单调性的布尔表达式求解分界点,比如在有序数列中求解数字$x$的排名。
\subparagraph{二分导数代替三分}
有时对于一些单峰函数,我们可以通过二分导函数的方法求解函数极值,这样使用时通常定义域为整数域比较方便,因为此时$dx$可以直接取整数$1$
\subparagraph{二分的例题} 我讨厌奶牛。
\paragraph{二分的例题} 我讨厌奶牛。
\codeinput[\href{http://poj.org/problem?id=2456}{POJ2456} - Aggressive cows]{assets/day7/poj2456.cpp}
你看,这次的答案就是\verb|L - 1|。
\paragraph{三分}
三分法适用于求解单峰函数的极值问题。二次函数就是一个典型的单峰函数。三分法与二分法一样,它会不断缩小答案所在的求解区间。二分法缩短区间利用的原理是函数的单调性,而三分法利用的则是函数的单峰性。\\
设当前求解的区间为$[l,r]$,令$m_1=l+\frac{r-l}{3},m_2=r-\frac{r-l}{3}$,接着我们计算这两个点
的函数值$f(m_1),f(m_2)$之后我们将两点中函数值更优的那个点称为好点(若计算最大值,则$f$更大的那个点就为好点,计算最小值同理),而函数值较差的那个点称为坏点。并且最优点与好点会在坏点同侧,即我们的求解区间由$[l,r]$变为了$[l,m_2]$$[m_1,r]$。因此根据这个结论我们可以不停缩短求解区间,直至可以得出近似解。
\paragraph{三分的写法} 以求上凸单峰函数的最大值为例,三分的代码:
\begin{verbatim}
while (R - L > eps) f(m1 = L + (R - L) / 3) < f(m2 = R - (R - L) / 3) ? L = m1 : R = m2;
\end{verbatim}
\paragraph{三分的例题} $$S=\pi rl+\pi r^2,h=\sqrt{l^2-r^2},V=\frac{1}{3}\pi r^2 h$$
若确定了底面半径,则其他值都可以依次计算出来,同时根据上面几个有关圆锥的公式也可以看出,$V$是关于$r$的一个单峰函数,因此三分底面半径求解
\codeinput[\href{http://poj.org/problem?id=3737}{POJ3737} - UmBasketella]{assets/day7/poj3737.cpp}
\end{document}
Loading…
Cancel
Save