題目不難,就是給定一個w * h的紙,中間切一刀,切出來的兩個矩形,從一個中剪下一個圓做圓柱的底,然后讓另一個彎起來套住底,做柱面,最后求能形成的最大體積。
練習的時候做了一下,總是WA。后來仔細想了一想,發現要討論幾種情況。首先要確保圓的直徑要不大于w,之后因為彎曲矩形可以有兩種方式,要分別討論。一種是高為w,這樣只需底面直徑越大越好。一種是高不定,這時候需要列一個方程,求出極值點??梢宰C明極值就是極大值。但是要注意的是底面圓直徑是有范圍的,要注意極值點是否落在范圍內。如果不在,由于極值點左側單調遞增,那么取直徑為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;
}