8416: 生日快乐
时间限制: 1 Sec 内存限制: 128 MB
提交: 61 解决: 34
[提交] [状态] [讨论版] [命题人:admin]
题目描述
windy的生日到了,为了庆祝生日,他的朋友们帮他买了一个边长分别为X和Y的矩形蛋糕。现在包括windy,一共有N个人来分这块大蛋糕,要求每个人必须获得相同面积的蛋糕。windy主刀,每一切只能平行于一块蛋糕的一边(任意一边),并且必须把这块蛋糕切成两块。这样,要切成N块蛋糕,windy必须切N-1次。为了使得每块蛋糕看起来漂亮,我们要求N块蛋糕的长边与短边的比值的最大值最小。你能帮助windy求出这个比值么?
输入
包含三个整数,X Y N。1 <= X,Y <= 10000 ; 1 <= N <= 10
输出
包含一个浮点数,保留6位小数。
样例输入
5 5 5
样例输出
1.800000
来源/分类
太菜,一开始没想到dfs,后来觉得可以爆搜一下,但是还是不太清楚怎么写,
再后来,晚上睡觉做梦给解出来了
这个蛋糕不管怎么说,肯定是一刀切两半,那么,
对于这两半,肯定进行和第一步一样的切,直到切不动了(面积等于要分的面积,即s=x*y/n)
假设咯,
先假设竖着切
|||||||||||||||||||||*|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|||||||||||||||||||||*|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|||||||||||||||||||||*|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|||||||||||||||||||||*|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|||||||||||||||||||||*|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
那么,一共分n份,假设左边k份,那么,容易算出分割点吧
/*
设s=1.0*x*y/n(每一块的面积),那么左边k块,面积就是k*s,
设横着w,竖着l,那左边竖直高度不变,还是l,但是横着w变成了k*s/l(l * k*s/l = k*s)
另一边同理
*/
那么横着切也是一样的分割,最后分出来后取最大值的最小值就好
两个写法
1,不管长和宽,在最后max一下
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5+7;
int n,x,y;
double s;
double dfs(double l,double w,int k){
if(k==1)
return max(w/l,l/w);
double ans = 1e10;
for(int i=1;i<k;i++){
double tans = max(dfs(w,i*s/w,i),dfs(w,(k-i)*s/w,k-i));
ans = min(ans,tans);
tans = max(dfs(l,i*s/l,i),dfs(l,(k-i)*s/l,k-i));
ans = min(ans,tans);
}
return ans;
}
int main()
{
scanf("%d%d",&x,&y);
scanf("%d",&n);
s = 1.*x*y/n;
printf("%.6f\n",dfs(1.*max(x,y),1.*min(x,y),n));
return 0;
}
2,每一步控制长和宽,即dfs第一个参数一定是长边,第二个。。。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5+7;
int n,x,y;
double s;
double dfs(double l,double w,int k){
if(k==1){
return l/w;
}
double ans = 1e10;
for(int i=1;i<k;i++){
double tans = 0;
tans = max(tans,dfs(max(w,i*s/w),min(w,i*s/w),i));
tans = max(tans,dfs(max(w,(k-i)*s/w),min(w,(k-i)*s/w),k-i));
ans = min(ans,tans);
tans = 0;
tans = max(tans,dfs(max(l,i*s/l),min(l,i*s/l),i));
tans = max(tans,dfs(max(l,(k-i)*s/l),min(l,(k-i)*s/l),k-i));
ans = min(ans,tans);
}
return ans;
}
int main()
{
scanf("%d%d",&x,&y);
scanf("%d",&n);
s = 1.*x*y/n;
printf("%.6f\n",dfs(1.*max(x,y),1.*min(x,y),n));
return 0;
}