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(); }