题意
- x*y蛋糕,切成n块等面积的,要求最大块的(长边/短边)最小
思路
- 对于每一块,切的时候切的位置总为当前块长度或者宽度/当前块要切成的块数,这样才能保证每一块面积相等你
- 也就是对于(x,y,n)横着切切的一定是x/n的倍数,并且若倍数为i,则一边应该且成i块,另一边应该切成n-i块
- 于是,每一次枚举横着切还是竖着切,每一种切法中枚举切的倍数i,切成的两份中,去返回值大的(最大边长比),最终在横着切和竖着切的里面小的那个就是更好的
- 直到n切成1块的时候,直接返回长边/短边的值
AC代码
#include<bits/stdc++.h>
using namespace std;
double dfs(double x,double y,int n){
if(n==1)return max(x,y)/min(x,y);
double a=x/n,b=y/n,ans=1e5;
for(int i=1;i<=n/2;i++){
//横切和竖切两种方法取比值小的,每种切法内取最大的返回
double h=max(dfs(i*a,y,i),dfs(x-a*i,y,n-i));
double s=max(dfs(x,i*b,i),dfs(x,y-i*b,n-i));
ans=min(ans,min(h,s));
}
return ans;
}
int main(){
double x,y;
int n;
scanf("%lf %lf %d",&x,&y,&n);
printf("%.6lf\n",dfs(x,y,n));
return 0;
}