列表

详情


NC20272. [SCOI2009]生日快乐

描述

windy的生日到了,为了庆祝生日,他的朋友们帮他买了一个边长分别为 X 和 Y 的矩形蛋糕。现在包括windy ,一共有 N 个人来分这块大蛋糕,要求每个人必须获得相同面积的蛋糕。
windy主刀,每一切只能平行于一块蛋糕 的一边(任意一边),并且必须把这块蛋糕切成两块。这样,要切成 N 块蛋糕,windy必须切 N-1 次。
为了使得每块蛋糕看起来漂亮,我们要求 N块蛋糕的长边与短边的比值的最大值最小。你能帮助windy求出这个比值么?

输入描述

包含三个整数,X Y N。
1 ≤ X,Y ≤ 10000 ; 1 ≤ N ≤ 10

输出描述

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

示例1

输入:

5 5 5

输出:

1.800000

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Python3 解法, 执行用时: 90ms, 内存消耗: 5000K, 提交时间: 2022-09-14 20:24:04

x, y, n = map(int, input().split())
def dfs(x, y, n):
    if n == 1:
        return max(x, y) / min(x, y)
    ans = float("inf")
    a, b = x / n, y / n
    for i in range(1, n // 2 + 1):
        ta = max(dfs(a * i, y, i), dfs(x - a * i, y, n - i))
        tb = max(dfs(x, b * i, i), dfs(x, y - b * i, n - i))
        ans = min(ans ,min(ta, tb))
    return ans 
print("%.6f" % dfs(x, y, n))

C++11(clang++ 3.9) 解法, 执行用时: 36ms, 内存消耗: 504K, 提交时间: 2020-07-14 16:35:48

#include<bits/stdc++.h>
using namespace std;
double dfs(double x,double y,int n){
    if(n==1)return max(x,y)/min(x,y);
    double ret=1e6;
    for(int i=1;i<n;++i)
        ret=min(ret,min(max(dfs(x/n*i,y,i),dfs(x/n*(n-i),y,n-i)),max(dfs(x,y/n*i,i),dfs(x,y/n*(n-i),n-i))));
    return ret;
}
int main(){
    double x,y;int n;
    cin>>x>>y>>n;
    printf("%.6lf",dfs(x,y,n));
}

上一题