bzoj1024 [SCOI2009]生日快乐
1024: [SCOI2009]生日快乐
Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 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 }