[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.
posted @ 2015-07-14 11:25  Vincent_hwh  阅读(101)  评论(0编辑  收藏  举报