zoukankan      html  css  js  c++  java
  • [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 ", 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(" %.2lf sec  ", (double)clock() / CLOCKS_PER_SEC);
    65 #endif
    66     return 0;
    67 }
    68 
    枚举方案
  • 相关阅读:
    大数加法、乘法实现的简单版本
    hdu 4027 Can you answer these queries?
    zoj 1610 Count the Colors
    2018 徐州赛区网赛 G. Trace
    1495 中国好区间 尺取法
    LA 3938 动态最大连续区间 线段树
    51nod 1275 连续子段的差异
    caioj 1172 poj 2823 单调队列过渡题
    数据结构和算法题
    一个通用分页类
  • 原文地址:https://www.cnblogs.com/Asm-Definer/p/4374007.html
Copyright © 2011-2022 走看看