题目不难,就是给定一个w * h的纸,中间切一刀,切出来的两个矩形,从一个中剪下一个圆做圆柱的底,然后让另一个弯起来套住底,做柱面,最后求能形成的最大体积。
练习的时候做了一下,总是WA。后来仔细想了一想,发现要讨论几种情况。首先要确保圆的直径要不大于w,之后因为弯曲矩形可以有两种方式,要分别讨论。一种是高为w,这样只需底面直径越大越好。一种是高不定,这时候需要列一个方程,求出极值点。可以证明极值就是极大值。但是要注意的是底面圆直径是有范围的,要注意极值点是否落在范围内。如果不在,由于极值点左侧单调递增,那么取直径为w就是这种情况的最优解。
这种题目比赛的时候很容易出错,需要静下心来仔细想好才行,这方面能力以后还要多多锻炼。
题目代码:
#include <iostream>
#include <cmath>
using namespace std;
const double pi = acos(-1.0), eps = 1e-6;
int main()
{
double w, h, s, d;
while (scanf("%lf %lf", &w, &h) == 2)
{
if (fabs(w) < eps && fabs(h) < eps)
break;
if (h < w)
swap(w, h);
d = h / (pi + 1);
d = min(d, w);
s = pi * d * d * 0.25 * w;
d = 2.0 * h / 3.0;
if (pi * d <= w)
{
d = min(d, w);
s = max(s, pi * h * h * h / 27.0);
}
s = max(s, w * w * (pi * h - w) / (4 * pi * pi));
printf("%.3lf\n", s);
}
return 0;
}