[bzoj1024]SCOI2009 生日快乐
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1024
dfs(x,y,n)表示长为y宽为x的矩形,分成n部分的最优值。
n:longint;
x,y:extended;
t:=i;i:=j;j:=t;
if i>j
then exit(j);exit(i);
if i>j
then exit(i);exit(j);
i:longint;
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);
readln(x,y,n);
writeln(dfs(x,y,n):0:6);
题目大意:给定一个x*y的矩形,切n-1刀分成n块大小相同的块,只能平行于边界切,求长宽比最大值最小化
一般来说,要求最大值最小化的题目都是用二分,当然这题也可以用二分答案,网上也有二分的解法。
然而这题有一个更简单的dfs做法。
就这样搜索是横切还是竖切,切在什么位置,当n=1时直接返回就好了
[Code]
var
procedure swap(var
i,j:extended);
var t:extended;
begin
end;
function
min(i,j:extended):extended;
begin
end;
function
max(i,j:extended):extended;
begin
end;
function
dfs(x,y:extended;n:longint):extended;
var
t,ans:extended;
begin
end;
begin
end.