AT_abc279_d

发布时间 2023-06-05 22:43:44作者: shinzanmono

Solution:

这题可以用数学方法来 AC:

我们可知用时 $T$ 与 重力加速度 $g$ 存在以下函数关系:
$$ T=f(g)=\frac{A}{\sqrt g}+B(g-1) \ \ \ g\geq1 \ \text{且} \ g \in \mathbb{N^+} $$
我们画出函数图像(绘图软件),可以发现当 $g \geq1$ 时,必有 $T\geq0$,且当 $g\geq0$ 时呈对钩状,所以在 $[0,+\infty)$ 必有一个最小值,我们需判断最小值是否满足 $g\geq1$。且当最小值为小数时,我们需要判断与它相邻的整数中,哪一个的函数值更小。

我们把目光转移到求最小值上,我们在函数图像上可以发现,再求的最小值时,函数的斜率为 $0$。我们考虑对原函数求导,在求使导函数为 $0$ 的 $g$,即:
$$
\begin{aligned}
& f'(g)=-\frac12A\cdot g^{-\frac32}+B \
\therefore & -\frac12A\cdot g^{-\frac32}+B=0\
\therefore & \ g=\left(\frac{A}{2B}\right)^\frac23
\end{aligned}
$$

然后进行分类讨论:

$$
ans =
\begin{cases}
f(1) & g<1 \
f(g) & g\in(\mathbb{N^+}\cap[1,+\infty))\
\min(f(\lfloor g\rfloor),f(\lceil g\rceil)) & \text{otherwise}
\end{cases}
$$
即可得出答案。

Code:

#include<iostream>
#include<cmath>
typedef long long ll;
ll a, b;
double f(double g){
    return a / sqrt(g) + b * (g - 1);
}
int main(){
    std::cin >> a >> b;
    double g = std::pow(1. * a / b / 2, 2. / 3.);
    if (g < 1) g = 1;
    else g = f(std::floor(g)) - f(std::ceil(g)) < 0 ? std::floor(g) : std::ceil(g);
    printf("%.6lf",f(g));
    return 0;
}