当前位置:   article > 正文

蓝桥杯每日一题-生日快乐_nz 主刀,每一切只能平行于一块蛋糕的一边(横或竖,边长可以是实数),并且必须把这块

nz 主刀,每一切只能平行于一块蛋糕的一边(横或竖,边长可以是实数),并且必须把这块

蓝桥杯每日一题-生日快乐

每日一题链接 洛谷题号 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值传递,宽的那一边同理。

AC代码

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;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/383833
推荐阅读