luogu_P4160 [SCOI2009]生日快乐

https://www.luogu.org/problem/P4160

题目描述

windy的生日到了,为了庆祝生日,他的朋友们帮他买了一个边长分别为 X 和 Y 的矩形蛋糕。

现在包括windy,一共有 N 个人来分这块大蛋糕,要求每个人必须获得相同面积的蛋糕。

windy主刀,每一切只能平行于一块蛋糕的一边(任意一边),并且必须把这块蛋糕切成两块。

这样,要切成 N 块蛋糕,windy必须切 N-1 次。

为了使得每块蛋糕看起来漂亮,我们要求 N 块蛋糕的长边与短边的比值的最大值最小。

你能帮助windy求出这个比值么?

输入格式

三个整数,X Y N。

输出格式

一个浮点数,保留6位小数。


 

毒瘤题面,没看到“要求每个人必须获得相同面积的蛋糕“,卡了一小时

每次横竖分必须都是那个倍数

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>

#define ri register int
#define u int

using std::string;
using std::max;
using std::min;

namespace all {

    u N,M,K;

    double dfs(const double &x,const double &y,const u &k) {
        if(k==1) {
            return (double)(max(x,y))/(double)(min(x,y));
        }
        double _re(9999999999.9),mx(x/(double)(k)),my(y/(double)(k));
        for(ri i(1); i<=k/2; ++i) {
            _re=min(_re,max(dfs(mx*i,y,i),dfs(x-mx*i,y,k-i)));
            _re=min(_re,max(dfs(x,my*i,i),dfs(x,y-my*i,k-i)));
        }
        return _re;
    }

    inline void solve() {
        std::cin>>N>>M>>K;
        printf("%.6lf",dfs((double)(N),(double)(M),K));
    }

}

int main() {

    //freopen("x.txt","r",stdin);
    all::solve();

}

 

posted @ 2019-10-24 16:19  pai_hoo  阅读(106)  评论(0编辑  收藏  举报