上文链接:蓝桥杯之母牛的故事-动态规划+归纳版(c++实现)
题目描述
使用一张纸和剪刀,您可以按照以下方式切出两个面以形成一个圆柱体:水平切纸(平行于较短边)以得到两个矩形部分。从第一部分开始,切出一个最大半径的圆。圆圈将形成圆柱体的底部。将第二部分向上滚动,使其周长与圆的周长相等,然后将卷的一端连接到圆上。请注意,卷筒可能会有一些重叠的部分,以便获得所需的周长。在给定纸张尺寸的情况下,您能否计算出可以使用上述步骤构造的最大量的滚筒?
切面展示:
输入
输入包含几个测试用例。每个测试用例都由两个数字w和h(1≤w≤h≤100)组成,分别表示纸张的宽度和高度。最后一个测试用例后面是包含两个零的行。
输出
对于每个测试用例,请打印出一行,并以最大的气缸容量来打印。将此数字四舍五入到小数点后3位。
样例输入
10 10
10 50
10 30
0 0
样例输出
54.247
785.398
412.095
该算法之我的思路
- 根据图形确定函数为
函数 | 结果 |
---|---|
v=πr^2(w-2r) | w=3r |
h>=2πr | h>=2πr |
因此v求导求得r=w/3时为最大值,不过需要满足r<=h/2/π,则判断出有两种可能:
1.r=w/3并且r<=h/2//π,此时r=w/3可求得最大体积
2.r=w/3并且r>h//2//π,此时r=h/2//π可取得最大体积
- 体积为double类型,在取小数点后三位操作时,我使用setprecision函数代替scanf格式化输出函数以促使高精度取值更加准确。
算法展示
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
int main()
{
double w[100],h[100];//定义w和h数组
int i =0;//记录数组个数,初始为零
double r,pi =atan(1.0)*4,vs[100];//定义π,r
cin>>w[i]>>h[i];
//数学公式求得体积最大值
while(w[i])
{
r = w[i]/3;
if(2*pi*r>h[i])r = h[i]/2/pi;
vs[i]= (pi*r*r)*(w[i]-2*r);
i++;
cin>>w[i]>>h[i];
}
//打印高精度中的某几位,也可以使用scanf做某几位输出。这里我使用setprecision输出
cout.setf(ios::fixed);
for(int j = 0;j<i;j++)
{
cout<<fixed<<setprecision(3)<<vs[j]<<endl;
}
return 0;
}