小红的函数最大值

[题目链接](https://www.nowcoder.com/practice/ef7f1d579daa4d349abd120a70b708e8)

思路

给定正整数 ),求函数 在定义域 上的最大值。

求导找驻点

求导:

$$

,解得:

$$

由于 ,所以 ,因此 ,确实在定义域内。

验证极大值

求二阶导数:

$$

因为 ,所以 对所有 成立,说明 是上凸函数,驻点 处取到全局最大值。

代入计算

代入原函数:

$$

直接按公式计算即可。注意 ,编程时使用自然对数 进行换底。

样例演示

输入

与预期输出 一致。

复杂度分析

  • 时间复杂度:,只需常数次浮点运算。
  • 空间复杂度:,只用常数额外空间。

代码

#include <cstdio>
#include <cmath>
using namespace std;

int main() {
    int a, b;
    scanf("%d %d", &a, &b);
    double lna = log((double)a);
    double x = 1.0 / (b * lna);
    double ans = log(x) / lna - b * x;
    printf("%.10f\n", ans);
    return 0;
}
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();
        double lna = Math.log(a);
        double x = 1.0 / (b * lna);
        double ans = Math.log(x) / lna - b * x;
        System.out.printf("%.10f%n", ans);
    }
}