蓝桥杯之Cylinder-数学知识+归纳(c++实现)

上文链接:蓝桥杯之母牛的故事-动态规划+归纳版(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;
}

下文链接:蓝桥杯之能量项链-类比哈夫曼树(c++实现)

发布了30 篇原创文章 · 获赞 3 · 访问量 2765

猜你喜欢

转载自blog.csdn.net/weixin_44077556/article/details/104238449
今日推荐