题目链接:
传送门
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
const int N = 200010;
int ca, t;
double l, w, x, v;
int main() {
scanf("%d", &t);
while(t--) {
scanf("%lf%lf", &l, &w);
//求最值对应的x坐标
x = (4 * (w + l) - sqrt(16 * (w + l) * (w + l) - 48 * w * l)) / 24;
//将坐标代入方程进行求解
v = x * (w - 2 * x) * (l - 2 * x);
printf("Case %d: %lf\n", ++ca, v);
}
}
这是一道一元三次方程求最值的过程。
首先根据题题意我们可以设该盒子高为x, 那么长就等于l - 2 * x, 宽度等于w - 2 * x。将式子展开我们可以得到:v = 4 * x ^ 3 - 2 * (w + l) * x ^ 2 + w * l * x。将这个式子求导可得 v’ = 12 * x ^ 2 - 4 * (w + l) * x + w * l。由于这个是一个开口向上的一个二次函数因此导函数会先大于0,后小于0,最后再大于0。以此我们可求两个解中偏小的那一个。那个解即为我们要求的x。至于x的求法,代入求根公式即可,最后把x代入方程即为所求解。