zoukankan      html  css  js  c++  java
  • [bzoj1024]SCOI2009 生日快乐

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1024
    题目大意:给定一个x*y的矩形,切n-1刀分成n块大小相同的块,只能平行于边界切,求长宽比最大值最小化
    一般来说,要求最大值最小化的题目都是用二分,当然这题也可以用二分答案,网上也有二分的解法
    然而这题有一个更简单的dfs做法。
      dfs(x,y,n)表示长为y宽为x的矩形,分成n部分的最优值。
    就这样搜索是横切还是竖切,切在什么位置,当n=1时直接返回就好了

    [Code]
    var
      n:longint;
      x,y:extended;
    procedure swap(var i,j:extended);
    var t:extended;
    begin
      t:=i;i:=j;j:=t;
    end;
    function min(i,j:extended):extended;
    begin
      if i>j then exit(j);exit(i);
    end;
    function max(i,j:extended):extended;
    begin
      if i>j then exit(i);exit(j);
    end;
    function dfs(x,y:extended;n:longint):extended;
    var t,ans:extended;
        i:longint;
    begin
      if x>y then swap(x,y);
      if n=1 then exit(y/x);
      t:=1/n;
      ans:=1e20;
      for i:=1 to n-1
      do
      begin
        ans:=min(ans,max(dfs(x,y*t*i,i),dfs(x,y-y*t*i,n-i)));
        ans:=min(ans,max(dfs(x*t*i,y,i),dfs(x-x*t*i,y,n-i)));//由于每个人得到的面积一定,所以说如果边长大的,面积就要相应的变大
      end;
      exit(ans);
    end;
    begin
      readln(x,y,n);
      writeln(dfs(x,y,n):0:6);
    end.
  • 相关阅读:
    curl库使用文件传输
    linux 命令
    第三方库交叉编译
    指针越界
    GetWindowRect GetClientRect
    libevent
    C#关闭窗体
    C# log日志窗口
    C++同一时刻仅允许一个实例,包含多用户的场景。
    C# 引用类型
  • 原文地址:https://www.cnblogs.com/vincent-hwh/p/5990337.html
Copyright © 2011-2022 走看看