[bzoj1024][SCOI2009]生日快乐 (枚举)

Description

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

Input

包含三个整数,X Y N。

Output

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

Sample Input

5 5 5

Sample Output

1.800000

HINT

【数据规模和约定】

100%的数据,满足 1 <= X,Y <= 10000 ; 1 <= N <= 10 。

 


分析

难得碰到一道水题QAQ 直接用dfs枚举所有的方案更新答案就好了……

 

 1 /**************************************************************
 2     Problem: 1024
 3     User: AsmDef
 4     Language: C++
 5     Result: Accepted
 6     Time:16 ms
 7     Memory:804 kb
 8 ****************************************************************/
 9  
10 /***********************************************************************/
11 /**********************By Asm.Def-Wu Jiaxin*****************************/
12 /***********************************************************************/
13 #include <cstdio>
14 #include <cstring>
15 #include <cstdlib>
16 #include <ctime>
17 #include <cctype>
18 #include <algorithm>
19 #include <cmath>
20 using namespace std;
21 #define SetFile(x) ( freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout) )
22 #define getc() getchar()
23 template<class T>inline void getd(T &x){
24     char ch = getc();bool neg = false;
25     while(!isdigit(ch) && ch != '-')ch = getc();
26     if(ch == '-')ch = getc(), neg = true;
27     x = ch - '0';
28     while(isdigit(ch = getc()))x = x * 10 - '0' + ch;
29     if(neg)x = -x;
30 }
31 /***********************************************************************/
32  
33 double dfs(int N, double L, double S){
34     if(L < S)swap(L, S);
35     if(N == 1)return L / S;
36     double Min = L/S*N, part = 1.0 / N, p;
37     int i, n = N / 2 - (N & 1 == 0);
38     for(i = 1;i <= n;++i){
39         p = part * i * L;
40         Min = min(Min, max(dfs(i, S, p), dfs(N-i, S, L-p)));
41         p = part * i * S;
42         Min = min(Min, max(dfs(i, L, p), dfs(N-i, L, S-p)));
43     }
44     if(N & 1 == 0)Min = min(Min, min(dfs(i, S, L / 2), dfs(i, L, S / 2)));
45     return Min;
46 }
47  
48 inline void work(){
49     int X, Y, N;
50     scanf("%d%d%d", &X, &Y, &N);
51     printf("%.6lf\n", dfs(N, X, Y));
52 }
53  
54 int main(){
55  
56 #ifdef DEBUG
57     freopen("test.txt""r", stdin);
58 #elif !defined ONLINE_JUDGE
59     SetFile(bzoj_1024);
60 #endif
61     work();
62  
63 #ifdef DEBUG
64     printf("\n%.2lf sec \n", (double)clock() / CLOCKS_PER_SEC);
65 #endif
66     return 0;
67 }
68 
枚举方案

 

posted @ 2015-03-28 12:00  Asm.Definer  阅读(196)  评论(0编辑  收藏  举报