题意:
将一块x*y的蛋糕切n-1刀分成n块面积相同的小蛋糕,每次切只能平行于边将一块切成二块。求N块蛋糕的长边与短边的比值的最大值最小为多少?
思路:
我们发现n<=10,而且每次切只能平行于边将一块切成二块,而且每一块面积相同,所以我们可以用dfs枚举每一种切法。
平行于y边切:可以切成(i * x/n) * y和((n-i) * x/n) * y两块(0<i<n,x/n表示将x分为n份,你只能切这份额的倍数,否则会导致最终无法切成面积相等的n块)
平行于x边切:可以切成(i * y/n) * x和((n-i) * y/n) * x两块
代码:
#include <bits/stdc++.h> #define inf 1000000007 #define eps 0.000001 using namespace std; typedef long long ll; typedef unsigned long long ull; const int maxn=100005; double dfs(double x,double y,double n) { if(n==1) { return max(x,y)/min(x,y); } double z=inf; for(int i=1;i<n;i++) { z=min(z,min(max(dfs(i*x*1.0/n,y,i),dfs((n-i)*x*1.0/n,y,n-i)),max(dfs(x,i*y*1.0/n,i),dfs(x,(n-i)*y*1.0/n,n-i)))); } return z; } int main() { double x, y, n; scanf("%lf%lf%lf",&x,&y,&n); double z=dfs(x,y,n); printf("%.6f",z); return 0; }