SCOI2009 生日蛋糕

每一切只能平行于一块蛋糕的一边(任意一边),并且必须把这块蛋糕切成两块。

这样,要切成 块蛋糕,必须切 N-1 次。

为了使得每块蛋糕看起来漂亮,我们要求 块蛋糕的长边与短边的比值的最大值最小。

求出这个比值。

最大最小≈二分答案。。。。

然后搜索判定,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.

 

 

 

posted @ 2012-04-17 16:44  Codinginging  阅读(232)  评论(0编辑  收藏  举报