题目描述
windy的生日到了,为了庆祝生日,他的朋友们帮他买了一个边长分别为 X 和 Y 的矩形蛋糕。
现在包括windy,一共有 N 个人来分这块大蛋糕,要求每个人必须获得相同面积的蛋糕。
windy主刀,每一切只能平行于一块蛋糕的一边(任意一边),并且必须把这块蛋糕切成两块。
这样,要切成 N 块蛋糕,windy必须切 N-1 次。
为了使得每块蛋糕看起来漂亮,我们要求 N 块蛋糕的长边与短边的比值的最大值最小。
你能帮助windy求出这个比值么?
输入输出格式
输入格式:
三个整数,X Y N。
输出格式:
一个浮点数,保留6位小数。
输入输出样例
说明
100%的数据,满足 1 <= X,Y <= 10000 ; 1 <= N <= 10 。
这道题第一反应我觉得应该是一个数学题,通过某种玄学gcd来做。
后来觉得DP也应该可以做。
最后实在是想不出来觉得还是搜索吧。
暴搜大法好!
代码如下:
1 #include<cstdio> 2 #include<cmath> 3 #include<algorithm> 4 using namespace std; 5 typedef double dl; 6 const dl INF = 0x3f3f3f3f; 7 dl x,y,n; 8 dl dfs(dl xx,dl yy,dl k) 9 { 10 if(k == 1) return max(xx,yy) / min(xx,yy); 11 dl ans = INF; 12 for(int i=1; i<k; i++) 13 { 14 ans = min(ans, max(dfs(xx, yy/k*i, i),dfs(xx, yy/k*(k-i), k-i))); 15 } 16 for(int i=1; i<k; i++) 17 { 18 ans = min(ans,max(dfs(xx/k*i,yy,i),dfs(xx/k*(k-i),yy,k-i))); 19 } 20 return ans; 21 } 22 int main() 23 { 24 scanf("%lf%lf%lf",&x,&y,&n); 25 printf("%.6lf\n",dfs(x,y,n)); 26 return 0; 27 }