<题目>
windy的生日到了,为了庆祝生日,他的朋友们帮他买了一个边长分别为 X 和 Y 的矩形蛋糕。现在包括windy,一共有 N 个人来分这块大蛋糕,要求每个人必须获得相同面积的蛋糕。 windy主刀,每一切只能平行于一块蛋糕的一边(任意一边),并且必须把这块蛋糕切成两块。这样,要切成 N 块蛋糕,windy必须切 N-1 次。为了使得每块蛋糕看起来漂亮,我们要求 N 块蛋糕的长边与短边的比值的最大值最小。你能帮助windy求出这个比值么?
<算法>
DFS
<分析>
关键点为每一块蛋糕的面积都是一样的,而且最多只会有10块蛋糕。一般来说题目里面出现这么小的数据量,不是状态压缩dp就是dfs,很明显这个题是dfs。每一步的时候分上下分还是左右分,每一种情况再枚举两边各分多少块蛋糕,当分到一块的时候就返回答案。
<注意>
-
要认真审题,我刚开始就是因为没有看到面积相等的条件,脑浆迸裂硬是没有想出正解
-
要对数据范围有敏感性
<代码>
/**************************************************************
Problem: 1024
User: gaotianyu1350
Language: C++
Result: Accepted
Time:160 ms
Memory:1276 kb
****************************************************************/
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <iostream>
using namespace std;
#define INF 1000000000
inline void swap(int &a,int &b)
{
int temp=a;a=b;b=temp;
}
inline double min(double a,double b)
{
return a<b?a:b;
}
inline double max(double a,double b)
{
return a>b?a:b;
}
inline double dfs(double x,double y,int left)
{
if (left==1)
{
if (x<y) swap(x,y);
return x/y;
}
double minAns=INF;
for (int i=1;i<left;i++)
{
double ans1=max(dfs(x/left*i,y,i),dfs(x/left*(left-i),y,left-i));
double ans2=max(dfs(x,y/left*i,i),dfs(x,y/left*(left-i),left-i));
minAns=min(minAns,min(ans1,ans2));
}
return minAns;
}
int main()
{
//freopen("input.txt","r",stdin);
int x,y,n;
scanf("%d%d%d",&x,&y,&n);
printf("%.6f\n",dfs(x,y,n));
}