P4160 [SCOI2009]生日快樂


題目描述

windy的生日到了,為了慶祝生日,他的朋友們幫他買了一個邊長分別為 X 和 Y 的矩形蛋糕。

現在包括windy,一共有 N 個人來分這塊大蛋糕,要求每個人必須獲得相同面積的蛋糕。

windy主刀,每一切只能平行於一塊蛋糕的一邊(任意一邊),並且必須把這塊蛋糕切成兩塊。

這樣,要切成 N 塊蛋糕,windy必須切 N-1 次。

為了使得每塊蛋糕看起來漂亮,我們要求 N 塊蛋糕的長邊與短邊的比值的最大值最小。

你能幫助windy求出這個比值么?

輸入輸出格式

輸入格式:

三個整數,X Y N。

輸出格式:

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

輸入輸出樣例

輸入樣例#1: 
5 5 5
輸出樣例#1: 
1.800000

說明

100%的數據,滿足 1 <= X,Y <= 10000 ; 1 <= N <= 10 。

 

Solution:

  本題不需要多想直接$dfs$。

  首先我們假設當前的矩形長為$x$,寬為$y$,要分出$k$塊,那么不難想到分出的一塊的長$mx$最短為$x/k$,寬$my$最短為$y/k$,而且每次切的長度一定是$mx$的倍數或$my$的倍數(很好理解,不是倍數就無法保證切出至少長$mx$的矩形或寬$my$的矩形,可以自行畫圖)。

  於是我們遞歸搜索,每次切長或者寬,在分出的兩塊中取比值的最大值,更新最大值的最小值,返回就$OK$了。

代碼:

 

 1 #include<bits/stdc++.h>
 2 #define il inline
 3 #define For(i,a,b) for(double (i)=(a);(i)<=(b);(i)++)
 4 using namespace std;
 5 int n,x,y;
 6 il double dfs(double x,double y,int k){
 7     if(k==1){return max(x,y)*1.0/min(x,y);}
 8     double ans=233333333,mx=x*1.0/k,my=y*1.0/k,t1,t2;
 9     For(i,1,k/2){
10         t1=max(dfs(mx*i,y,i),dfs(x-mx*i,y,k-i));
11         t2=max(dfs(x,my*i,i),dfs(x,y-my*i,k-i));
12         ans=min(ans,min(t1,t2));
13     }
14     return ans;
15 }
16 int main(){
17     cin>>x>>y>>n;
18     printf("%.6lf",dfs(x,y,n));
19     return 0;
20 }

 

 

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com