[BZOJ1024][SCOI2009]生日快乐解题报告

Description

  windy的生日到了,为了庆祝生日,他的朋友们帮他买了一个边长分别为 X 和 Y 的矩形蛋糕。现在包括windy,一共有 N 个人来分这块大蛋糕,要求每个人必须获得相同面积的蛋糕。 windy主刀,每一切只能平行于一块蛋糕的一边(任意一边),并且必须把这块蛋糕切成两块。这样,要切成 N 块蛋糕,windy必须切 N-1 次。为了使得每块蛋糕看起来漂亮,我们要求 N 块蛋糕的长边与短边的比值的最大值最小。你能帮助windy求出这个比值么?

 

  最简单的暴搜...枚举这一刀下去分成两边的块数和是横切还是竖切就好了...因为n<=10所以就算这么暴力还是可以过...

 1 /**************************************************************
 2     Problem: 1024
 3     Author: mjy0724
 4     Time:572 ms
 5     Memory:224 kb
 6 ****************************************************************/
 7  
 8 program bzoj1024;
 9 var x,y:extended;
10     p:longint;
11  
12 function max(a,b:extended):extended;
13 begin
14     if a>b then exit(a) else exit(b);
15 end;
16  
17 function min(a,b:extended):extended;
18 begin  
19     if a<b then exit(a) else exit(b);
20 end;
21  
22 function dfs(x,y:extended;p:longint):extended;
23 var ans:extended;   
24     i:longint;
25 begin
26     if p=1 then exit(max(x/y,y/x));
27     ans:=min(max(dfs(x*1/p,y,1),dfs(x-x*1/p,y,p-1)),max(dfs(x,y*1/p,1),dfs(x,y-y*1/p,p-1)));
28     for i:=1 to p >> 1 do
29         ans:=min(ans,min(max(dfs(x*i/p,y,i),dfs(x-x*i/p,y,p-i)),max(dfs(x,y*i/p,i),dfs(x,y-y*i/p,p-i))));
30     exit(ans);  
31 end;
32  
33 begin
34     readln(x,y,p);
35     writeln(dfs(x,y,p):0:6);
36 end.

 

  

posted @ 2015-04-13 09:57  mjy0724  阅读(176)  评论(0编辑  收藏  举报