1. 程式人生 > >[SCOI2009]生日快樂

[SCOI2009]生日快樂

out urn div body output 面積 漂亮 string 是否

Description

  windy的生日到了,為了慶祝生日,他的朋友們幫他買了一個邊長分別為 X 和 Y 的矩形蛋糕。現在包括windy
,一共有 N 個人來分這塊大蛋糕,要求每個人必須獲得相同面積的蛋糕。windy主刀,每一切只能平行於一塊蛋糕
的一邊(任意一邊),並且必須把這塊蛋糕切成兩塊。這樣,要切成 N 塊蛋糕,windy必須切 N-1 次。為了使得
每塊蛋糕看起來漂亮,我們要求 N塊蛋糕的長邊與短邊的比值的最大值最小。你能幫助windy求出這個比值麽?

Input

  包含三個整數,X Y N。1 <= X,Y <= 10000 ; 1 <= N <= 10

Output

  包含一個浮點數,保留6位小數。

Sample Input

5 5 5

Sample Output

1.800000 先要把矩形分成n塊,切n-1次 那先把矩形縱向(橫向)均等分成n塊 把它縱向(橫向)按比例切一刀分成兩個部分 假設第一部分占了i塊,另一個占n-i塊,即面積比為i:n-i 那麽問題就遞歸轉化成了把第一個矩形再切i-1刀,分成i塊 第二個再切n-i-1刀,分成n-i塊 這樣最後切出的n個矩形面積肯定相同 每次在切出的2個矩形的最大比例中取最大值,看是否小於當前答案 橫切和縱切一樣,可以枚舉i一起算
 1 #include<iostream>
 2
#include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 double dfs(double x,double y,double k) 8 { 9 double i; 10 double ans=2e9; 11 if (k==1) return (max(x,y)/min(x,y)); 12 for (i=1;i<k;i++) 13 {
14 ans=min(ans,max(dfs(x,y*i/k,i),dfs(x,y*(k-i)/k,k-i))); 15 ans=min(ans,max(dfs(x*i/k,y,i),dfs(x*(k-i)/k,y,k-i))); 16 } 17 return ans; 18 } 19 int main() 20 {double X,Y,k; 21 cin>>X>>Y>>k; 22 printf("%.6lf",dfs(X,Y,k)); 23 }

[SCOI2009]生日快樂