zoukankan      html  css  js  c++  java
  • POJ1190 洛谷P1731 NOI1999 生日蛋糕

    生日蛋糕(蛋糕是谁?)
    Time Limit: 1000MS   Memory Limit: 10000K
    Total Submissions: 20272   Accepted: 7219

    Description

    7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体。
    设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱。当i < M时,要求Ri > Ri+1且Hi > Hi+1。
    由于要在蛋糕上抹奶油,为尽可能节约经费,我们希望蛋糕外表面(最下一层的下底面除外)的面积Q最小。
    令Q = Sπ
    请编程对给出的N和M,找出蛋糕的制作方案(适当的Ri和Hi的值),使S最小。
    (除Q外,以上所有数据皆为正整数)

    Input

    有两行,第一行为N(N <= 10000),表示待制作的蛋糕的体积为Nπ;第二行为M(M <= 20),表示蛋糕的层数为M。

    Output

    仅一行,是一个正整数S(若无解则S = 0)。

    Sample Input

    100
    2

    Sample Output

    68

    Hint

    圆柱公式
    体积V = πR2H
    侧面积A' = 2πRH
    底面积A = πR2

    Source

    Noi 99

    【题解】神搜索题。
    剪枝1:半径、高度从大到小搜
    剪枝2:step层半径范围:[step,  min(sqrt((n - v)/step), r[step + 1] - 1],高度范围:[step, min((n - v)/(i * i), h[step + 1] - 1)]
    剪枝3:预处理1~step层最小体积/表面积
    剪枝4:不难发现到了第step层,确定了step + 1 ~ m层的体积v,想办法表示出1~step层的表面积下界,进行最优性剪枝
    1 ~ step层的体积就确定了:n-v = Σr*r*h
    1~step层的表面积就是:2 * Σr * h > 2 * (n - v)/h[step]
     
     1 #include <iostream>
     2 #include <cstdlib>
     3 #include <cstring>
     4 #include <cstdio>
     5 #include <algorithm>
     6 #include <cmath>
     7 #define min(a, b) ((a) < (b) ? (a) : (b))
     8 #define max(a, b) ((a) > (b) ? (a) : (b))
     9 
    10 const int MAXM = 20 + 5;
    11 const int INF = 0x3f3f3f3f;
    12 
    13 int n,ans,m,r[MAXM],h[MAXM],mis[MAXM],miv[MAXM];
    14 
    15 void dfs(int step, int v, int s)
    16 {
    17     if(step == 0)
    18     {
    19         if(v == n) ans = min(ans, s);
    20         return;
    21     }
    22     if(s + mis[step] >= ans)return;
    23     if(v + miv[step] > n)return;
    24     if(2 * (n - v)/r[step + 1] + s >= ans)return;
    25     for(register int i = min(sqrt((double)(n - v)/step), r[step + 1] - 1);i >= step;-- i)
    26         for(register int j = min((n - v)/(i * i), h[step + 1] - 1);j >= step;-- j)
    27         {
    28             r[step] = i, h[step] = j;
    29             if(step == m)dfs(step - 1, i * i * j, i * i + 2 * i * j);
    30             else dfs(step - 1, v + i * i * j, s + 2 * i * j);
    31             r[step] = h[step] = 0;
    32         }
    33     return;
    34 } 
    35 
    36 int main()
    37 {
    38     scanf("%d %d", &n, &m);
    39     for(register int i = 1;i <= m;++ i)
    40     {
    41         miv[i] = miv[i - 1] + i*i*i;
    42         mis[i] = mis[i - 1] + 2 * i * i;
    43     }
    44     r[m + 1] = h[m + 1] = INF;
    45     ans = INF;
    46     dfs(m,0,0);
    47     if(ans == INF)ans = 0;
    48     printf("%d", ans);
    49     return 0;
    50 } 
    POJ1011 生日蛋糕
     
  • 相关阅读:
    排序算法的稳定性
    字符串处理常用函数
    判断两棵二叉树是否相等
    约瑟夫环
    自加++
    Linux 安装配置 Tomcat
    在 eclipse 中将 web 项目部署到 tomcat 服务器上
    PHP连接MySQL数据库
    logback
    Log4J
  • 原文地址:https://www.cnblogs.com/huibixiaoxing/p/7388567.html
Copyright © 2011-2022 走看看