题目描述

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 。

这道题第一反应我觉得应该是一个数学题,通过某种玄学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 }