藍橋杯之Cylinder-數學知識+概括(c++實現)

上文連接:藍橋杯之母牛的故事-動態規劃+概括版(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

相關文章
相關標籤/搜索