题目描述
windy 的生日到了,为了庆祝生日,他的朋友们帮他买了一个边长分别为 XX 和 YY 的矩形蛋糕。
现在包括 windy,一共有 NN 个人来分这块大蛋糕,要求每个人必须获得相同面积的蛋糕。
windy 主刀,每一切只能平行于一块蛋糕的一边(任意一边),并且必须把这块蛋糕切成两块。
这样,要切成 NN 块蛋糕,windy 必须切 N-1N−1 次。
为了使得每块蛋糕看起来漂亮,我们要求 NN 块蛋糕的长边与短边的比值的最大值最小.
你能帮助 windy $求出这个比值么?
输入描述
输入三个整数,X, Y ,N ,1≤X, Y≤10^4,1≤N≤10
输出描述
输出一个浮点数,为所求比值,保留 66 位小数。
输入输出样例
5 5 5
1.800000
解题思路
①一刀必须分为两块蛋糕,而且最后所得到的面积相等,则每一刀所切的长(宽)都是X/Z(Y/Z)的整数倍
②以一条长为例,切一刀后的两块蛋糕的长,为下一次所需切的值,一直传递下去,满足终止条件则停止
③当Z==1时,终止,返回长和宽的比值即可
④长和宽可以理解为两种道路,使每块蛋糕的最大长宽比值最小,就相当于给定一个条件式去搜索不同情况的最大值,在求得其中的最小情况,
代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner=new Scanner(System.in);
double x=scanner.nextDouble();
double y=scanner.nextDouble();
double z=scanner.nextDouble();
System.out.printf("%.6f",dfs(x,y,z));
}
public static double dfs(double x,double y,double z) {
if(z==1) {//终止条件,当最后一刀切完时直接返回
return Math.max(x,y)/Math.min(x, y);
}
double ans=10001;//1≤X, Y≤10^4,所以最大值为10000
double mx=x/z;
double my=y/z;
for(int i=1;i<=z/2;i++) {
double xx=Math.max(dfs(i*mx, y, i), dfs(x-i*mx, y, z-i));
double yy=Math.max(dfs(x, i*my, i), dfs(x, y-i*my, z-i));
ans=Math.min(ans, Math.min(xx, yy));
}
return ans;
}
}
内存: 34456kb
程序运行耗时: 375ms