赞
踩
每日一题链接 洛谷题号 p4160
windy 的生日到了,为了庆祝生日,他的朋友们帮他买了一个边长分别为 XX 和 YY 的矩形蛋糕。
现在包括 windy,一共有 NN 个人来分这块大蛋糕,要求每个人必须获得相同面积的蛋糕。
windy 主刀,每一切只能平行于一块蛋糕的一边(任意一边),并且必须把这块蛋糕切成两块。
这样,要切成 NN 块蛋糕,windy 必须切 N-1N−1 次。
为了使得每块蛋糕看起来漂亮,我们要求 NN 块蛋糕的长边与短边的比值的最大值最小。
你能帮助 windy $求出这个比值么?
一行,包含三个整数,X,Y,N。
包含一个浮点数,保留 6 位小数。
1≤X,Y≤10000,
1≤N≤10
5 5 5
1.800000
首先要明确的是,由于最后每份蛋糕的面积相同,(以长为例)所以每次切只能切x/k的整数倍,x/k称为最小块,k代表当且剩下的刀数+1,每次切的位置必须是k等分点,否则无法使得每块蛋糕面积相同。
其次每次只能切一刀,一刀之后,一个蛋糕会变成两个,两个蛋糕的的面积比决定了剩余刀数的分配。最小块的倍数作为下个k值传递,宽的那一边同理。
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); double x=scan.nextDouble(); double y=scan.nextDouble(); double n=scan.nextDouble(); System.out.printf("%.6f",dfs(x,y,n)); scan.close(); } public static double dfs(double a,double b,double k) { if(k==1) return Math.max(a,b)/Math.min(a,b); double ans=100000007,mx=a/k,my=b/k; for(double i=1;i<=k/2;i++) { double t=Math.max(dfs(i*mx,b,i),dfs(a-i*mx,b,k-i)); double p=Math.max(dfs(a,i*my,i),dfs(a,b-i*my,k-i)); ans=Math.min(ans,Math.min(t,p)); } return ans; } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。