http://acmore.net/problem.php?id=1525
1525: Cylinder(圆柱体)
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 14 Solved: 4
Description
使用剪刀和一张纸,根据下面的步骤,可以剪出两个面来形成一个圆柱体:
1 平行于最短边把纸剪成两个长方形;
2 在第一长方形上,剪一个具有最大半径的圆,这个圆形成圆柱体的底.
3 卷起第二个长方形,使它的周长等于上一步骤中圆的周长 ,并把圆桶的一端与圆粘在一起.(为了使卷起的圆桶的周长等于圆的周长,它可以有重叠的部分).给出纸张的宽度和高度,你能计算出通过上述方法做出的圆柱体的最大体积吗?
Input
输入包含几个测试用例,每一个测试用例包含两个数w and h (1 ≤ w ≤ h ≤ 100),表示纸张的宽度和高度,最后一个测试用例后有两个0.
Output
对每一个测试用例,打印一行最大可能的圆柱体体积,通过四舍五入保留三个小数
Sample Input
10 10 10 50 10 30 0 0
Sample Output
54.247 785.398 412.095
HINT
PI = 3.141593
Source
Anything about the Problems, Please Contact Admin:admin
解析:谁知道我一看到这道题就马上想到了数学里的函数求最大值来着。还列列了方程求导,求根等等,越想越烦琐。最后把这最简单的一道题目给错过了
其实只要枚举一下情况就可以了
h-2*r1
情况一 w w
r1=min(w/2.0,h/(2*pi+2));v1=pi*r1*r1*wl;
情况二 h-2*r2
w
r2=w/(2*pi) ,v2=pi*r2*r2*(h-2*r2);
//wronganswer:错的原因是因为题目没有看清楚,我把两种切法都考虑进去了,而题目只要求第一种切法
#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <assert.h>
using namespace std;
const double pi= 2.0*acos(0.0);
double max(double a,double b)
{
return a>b? a:b;
}
double min(double a,double b)
{return a<b? a:b;
}
double volume(double r,double h)
{
return pi*r*r*h;
}
int main()
{freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
double w,h;
double r1,r2,v1,v2,t;
while(scanf("%lf%lf",&w,&h)!=EOF)
{ if(w==0&&h==0)
break;
//r1=min(h/(2.0*pi+2.0),w/2.0);//竖切
v1=volume(r1,w);
r2=w/(2.0*pi);
v2=volume(r2,h-2.0*r2);
//printf("r1=%.3lf v1=%.3lf,r2=%.3lf,v2=%.3lf\n",r1,v1,r2,v2);
t=max(v1,v2);
r1=w/(2.0*pi+2.0);//横切
v1=volume(r1,h);
r2=h/(2.0*pi);
v2=volume(r2,w-2.0*r2);
// printf("r1=%.3lf v1=%.3lf,r2=%.3lf,v2=%.3lf\n",r1,v1,r2,v2);
t=max(t,max(v1,v2));
printf("%.3lf\n",t);
}
return 0;
}
//accept
#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <assert.h>
using namespace std;
const double pi= 2.0*acos(0.0);
double max(double a,double b)
{
return a>b? a:b;
}
double min(double a,double b)
{return a<b? a:b;
}
double volume(double r,double h)
{
return pi*r*r*h;
}
int main()
{
double w,h;
double r1,r2,v1,v2,t;
while(scanf("%lf%lf",&w,&h)!=EOF)
{ if(w==0&&h==0)
break;
r1=min(h/(2.0*pi+2.0),w/2.0);//竖切,即沿着h处切
v1=volume(r1,w);
r2=w/(2.0*pi);
v2=volume(r2,h-2.0*r2);
printf("%.3lf\n",t);
}
return 0;
}