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 ?
枚举方案