蓝桥杯练习—生日快乐

题目连接

题目描述

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北极,南极

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值