BZOJ1024 [SCOI2009]生日快乐

本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。

 

 

本文作者:ljh2000
作者博客:http://www.cnblogs.com/ljh2000-jump/
转载请注明出处,侵权必究,保留最终解释权!

 

Description

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

Input

  包含三个整数,X Y N。1 <= X,Y <= 10000 ; 1 <= N <= 10

Output

  包含一个浮点数,保留6位小数。

Sample Input

5 5 5

Sample Output

1.800000

 

 

正解:搜索

解题报告:

  裸搜索题,直接搜索每次横着切还是竖着切,同时均分成多少块。因为每个人的面积相等,所以注意一下,切成两半后必须要保证两边分成的块数之比要等于面积之比,仔细想想就可以想通了。

 

 1 //It is made by ljh2000
 2 #include <iostream>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <cstdio>
 6 #include <cmath>
 7 #include <algorithm>
 8 #include <ctime>
 9 #include <vector>
10 #include <queue>
11 #include <map>
12 #include <set>
13 #include <string>
14 #include <stack>
15 using namespace std;
16 typedef long long LL;
17 int X,Y,n;
18 
19 inline int getint(){
20     int w=0,q=0; char c=getchar(); while((c<'0'||c>'9') && c!='-') c=getchar();
21     if(c=='-') q=1,c=getchar(); while (c>='0'&&c<='9') w=w*10+c-'0',c=getchar(); return q?-w:w;
22 }
23 
24 inline double dfs(int num,double x,double y){//需要分成num块,且矩形长宽分别为x,y
25     if(num==1) return max(x,y)/min(x,y); double now=1e20,nowx,nowy;
26     for(int i=1;i<=num/2;i++) {//枚举横着或者竖着分成i份
27     nowx=x/num*i; nowy=y/num*i;//分成
28     now=min(now,max(dfs(i,nowx,y),dfs(num-i,x-nowx,y)));
29     now=min(now,max(dfs(i,x,nowy),dfs(num-i,x,y-nowy)));
30     }
31     return now;
32 }
33 
34 inline void work(){
35     X=getint(); Y=getint(); n=getint();
36     printf("%.6lf",dfs(n,X,Y));
37 }
38 
39 int main()
40 {
41     work();
42     return 0;
43 }

 

posted @ 2016-11-14 20:39  ljh_2000  阅读(480)  评论(0编辑  收藏