上文连接:蓝桥杯之母牛的故事-动态规划+概括版(c++实现)
ios
题目描述
使用一张纸和剪刀,您能够按照如下方式切出两个面以造成一个圆柱体:水平切纸(平行于较短边)以获得两个矩形部分。从第一部分开始,切出一个最大半径的圆。圆圈将造成圆柱体的底部。将第二部分向上滚动,使其周长与圆的周长相等,而后将卷的一端链接到圆上。请注意,卷筒可能会有一些重叠的部分,以便得到所需的周长。在给定纸张尺寸的状况下,您可否计算出可使用上述步骤构造的最大量的滚筒?c++
切面展现:
输入
输入包含几个测试用例。每一个测试用例都由两个数字w和h(1≤w≤h≤100)组成,分别表示纸张的宽度和高度。最后一个测试用例后面是包含两个零的行。算法
输出
对于每一个测试用例,请打印出一行,并以最大的气缸容量来打印。将此数字四舍五入到小数点后3位。数组
样例输入
10 10
0 0函数
样例输出
54.247测试
该算法之个人思路
函数 | 结果 |
---|---|
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//π可取得最大致积spa
-体积为double类型,在取小数点后三位操做时,我使用setprecision函数代替scanf格式化输出函数以促使高精度取值更加准确。.net
算法展现
#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; }
下文连接:蓝桥杯之能量项链-类比哈夫曼树(c++实现)code