[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枚举所有的方案更新答案就好了……

 

ExpandedBlockStart.gif
 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 
枚举方案

 

转载于:https://www.cnblogs.com/Asm-Definer/p/4374007.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值