1 条题解

  • 0
    @ 2025-8-24 21:57:09

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 浅色调
    **

    搬运于2025-08-24 21:57:09,当前版本为作者最后更新于2018-05-16 17:51:33,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    Solution:

    本题不需要多想直接dfsdfs

    首先我们假设当前的矩形长为xx,宽为yy,要分出kk块,那么不难想到分出的一块的长mxmx最短为x/kx/k,宽mymy最短为y/ky/k,而且每次切的长度一定是mxmx的倍数或mymy的倍数(很好理解,不是倍数就无法保证之后切出至少长mxmx的矩形或宽mymy的矩形,可以自行画图)。

    于是我们递归搜索,每次切长或者宽,在分出的两块中取比值的最大值,更新最大值的最小值,返回就OKOK了。

        \quad\;\;欢迎来踩博客:five20(蒟蒻写题解不易,转载请注明出处,万分感谢!)

    代码:

    #include<bits/stdc++.h>
    #define il inline
    #define For(i,a,b) for(double (i)=(a);(i)<=(b);(i)++)
    using namespace std;
    int n,x,y;
    il double dfs(double x,double y,int k){
        if(k==1){return max(x,y)*1.0/min(x,y);}
        double ans=233333333,mx=x*1.0/k,my=y*1.0/k,t1,t2;
        For(i,1,k/2){
            t1=max(dfs(mx*i,y,i),dfs(x-mx*i,y,k-i));
            t2=max(dfs(x,my*i,i),dfs(x,y-my*i,k-i));
            ans=min(ans,min(t1,t2));
        }
        return ans;
    }
    int main(){
        cin>>x>>y>>n;
        printf("%.6lf",dfs(x,y,n));
        return 0;
    }
    
    • 1

    信息

    ID
    3117
    时间
    1000ms
    内存
    125MiB
    难度
    4
    标签
    递交数
    0
    已通过
    0
    上传者