SCOI2009 生日蛋糕
每一切只能平行于一块蛋糕的一边(任意一边),并且必须把这块蛋糕切成两块。
这样,要切成 N 块蛋糕,必须切 N-1 次。
为了使得每块蛋糕看起来漂亮,我们要求 N 块蛋糕的长边与短边的比值的最大值最小。
求出这个比值。
最大最小≈二分答案。。。。
然后搜索判定,dfs(xx,yy,limit,nn)表示要把长宽为xx,yy切成nn块蛋糕,答案不超过limit是否可行。
View Code
1 program cake(input,output); 2 var 3 x,y,n:longint; 4 answer:double; 5 s:double; 6 procedure init; 7 begin 8 readln(x,y,n); 9 s:=x*y/n; 10 end; 11 12 function max(aa,bb:double):double; 13 begin 14 if aa>bb then 15 exit(aa); 16 exit(bb); 17 end; 18 19 function min(aa,bb:double):double; 20 begin 21 if aa<bb then 22 exit(aa); 23 exit(bb); 24 end; 25 26 function can(xx,yy,limit:double;nn:integer):boolean; 27 var 28 i,j :longint; 29 x1,y1,x2,y2:double; 30 begin 31 if nn=1 then 32 begin 33 if max(xx,yy)/min(xx,yy)<=limit then 34 exit(true); 35 exit(false); 36 end; 37 for i:=1 to nn>>1 do 38 begin 39 x1:=s*i/yy; 40 x2:=s*(nn-i)/yy; 41 can:=can(x1,yy,limit,i) and can(x2,yy,limit,nn-i); 42 if can then 43 exit; 44 y1:=s*i/xx; 45 y2:=s*(nn-i)/xx; 46 can:=can(xx,y1,limit,i) and can(xx,y2,limit,nn-i); 47 if can then 48 exit; 49 end; 50 exit(false); 51 end; 52 procedure main; 53 var 54 ll,rr,mid:double; 55 begin 56 ll:=0.00000000; 57 rr:=99999999999; 58 while rr-ll>1e-7 do 59 begin 60 mid:=(ll+rr)/2; 61 if can(x,y,mid,n) then 62 rr:=mid 63 else 64 ll:=mid; 65 end; 66 writeln(rr:0:6); 67 end; 68 begin 69 assign(input,'cake.in');reset(input); 70 assign(output,'cake.out');rewrite(output); 71 init; 72 main; 73 close(input); 74 close(output); 75 end.