bzoj1024 [SCOI2009]生日快乐

1024: [SCOI2009]生日快乐

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 1801  Solved: 1276

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 。

 

Source

 

题意:显然的

题解:面积一样,但形状不一定一样,想通这点就简单了。

面积可以算出来,因为最多分10块,而且每次不是横切就是竖切,所以对于每一块,枚举怎么切,再枚举每边分多少块,显然可以通过枚举的块数来算出每块的新的长和宽,递归下去。

显然,我们最多枚举N-1次,每次枚举怎么切(2种),再枚举分多少块,复杂度不会太高

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <cmath>
 5 #include <deque>
 6 #include <vector>
 7 #include <queue>
 8 #include <iostream>
 9 #include <algorithm>
10 #include <map>
11 #include <set>
12 #include <ctime>
13 using namespace std;
14 typedef long long LL;
15 typedef double DB;
16 #define For(i, s, t) for(int i = (s); i <= (t); i++)
17 #define Ford(i, s, t) for(int i = (s); i >= (t); i--)
18 #define Rep(i, t) for(int i = (0); i < (t); i++)
19 #define Repn(i, t) for(int i = ((t)-1); i >= (0); i--)
20 #define rep(i, x, t) for(int i = (x); i < (t); i++)
21 #define MIT (2147483647)
22 #define INF (1000000001)
23 #define MLL (1000000000000000001LL)
24 #define sz(x) ((int) (x).size())
25 #define clr(x, y) memset(x, y, sizeof(x))
26 #define puf push_front
27 #define pub push_back
28 #define pof pop_front
29 #define pob pop_back
30 #define ft first
31 #define sd second
32 #define mk make_pair
33 inline void SetIO(string Name) {
34     string Input = Name+".in",
35     Output = Name+".out";
36     freopen(Input.c_str(), "r", stdin),
37     freopen(Output.c_str(), "w", stdout);
38 }
39 
40 DB n, m;
41 int k;
42 
43 inline void Input() {
44     cin>>n>>m>>k;
45 }
46 
47 inline DB Search(DB n, DB m, int k) {
48     if(n < m) swap(n, m);
49     if(k == 1) return n/m;
50     DB Ret = 1.0*INF, x, A, B;
51     //Heng
52     x = n/k;
53     For(i, 1, k-1) {
54         A = Search(x*i, m, i);
55         B = Search(x*(k-i), m, k-i);
56         Ret = min(Ret, max(A, B));
57     }
58     
59     // Shu
60     x = m/k;
61     For(i, 1, k-1) {
62         A = Search(n, x*i, i);
63         B = Search(n, x*(k-i), k-i);
64         Ret = min(Ret, max(A, B));
65     }
66     
67     return Ret;
68 }
69 
70 inline void Solve() {
71     DB Ans = Search(n, m, k);
72     printf("%.6lf\n", Ans);
73 }
74 
75 int main() {
76     SetIO("1024");
77     Input();
78     Solve();
79     return 0;
80 }
View Code

 

posted @ 2015-08-26 13:15  yanzx6  阅读(139)  评论(0编辑  收藏