8416: 生日快乐---入门dfs

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

来源/分类

四川OI2009 

太菜,一开始没想到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;
}

猜你喜欢

转载自blog.csdn.net/Du_Mingm/article/details/83957887