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