• 【POJ


    -->生日蛋糕 

    Descriptions:

    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 = πR 2
    侧面积A' = 2πRH 
    底面积A = πR 2 
     
    深搜很容易想到  但是烦人的是剪枝 要剪好多 具体去除重复剪枝还有这些要注意
      如果剩余的最上面几层的最小体积>剩余需要的体积,那么直接退出
      如果剩余的最上面几层的最小面积+当前面积>=已经求出的最小面积,那么直接退出
     
    AC代码:
    #include <iostream>
    #include <cstdio>
    #include <fstream>
    #include <algorithm>
    #include <cmath>
    #include <deque>
    #include <vector>
    #include <queue>
    #include <string>
    #include <cstring>
    #include <map>
    #include <stack>
    #include <set>
    #include <sstream>
    #define mod 1000000007
    #define eps 1e-6
    #define ll long long
    #define INF 0x3f3f3f3f
    #define MEM(x,y) memset(x,y,sizeof(x))
    #define Maxn 25
    using namespace std;
    int V,M;
    int minArea;
    int area;
    int minv[Maxn],minarea[Maxn];
    void init()
    {
        minv[0]=0;
        minarea[0]=0;
        for(int i=1; i<Maxn; i++)
        {
            minv[i]=minv[i-1]+i*i*i;
            minarea[i]=minarea[i-1]+2*i*i;
        }
    }
    //剩余层数也是第m层、当前所有体积、当前所有面积,当前这层蛋糕的半径,当前这层蛋糕的高
    void dfs(int m,int v,int area,int r,int h)
    {
        if(m==0)//搜索完成,则更新最小面积值
        {
            if(v==V&&area<minArea)
                minArea=area;
            return;
        }
        //剪枝
        if(minv[m-1]>V-v||2*(V-v)/r+area>=minArea)
            return;
        //按递减顺序枚举m层蛋糕半径的每一个可能值
        for(int i=r-1; i>=m; i--)
        {
            if(m==M)//底面积作为外表面积的初始值
                area=i*i;
            //最大高度,即m层蛋糕高度的上限
            int maxh=min(h-1,V-area-minarea[m-1]/(i*i));
            for(int j=maxh; j>=m; j--)
            {
                dfs(m-1,v+i*i*j,area+2*i*j,i,j);
            }
        }
    }
    int main()
    {
        init();
        minArea=INF;
        cin>>V>>M;//面积,层数
        dfs(M,0,0,V+1,V+1);
        if(minArea==INF)
            cout<<0<<endl;
        else
            cout<<minArea<<endl;
    }
  • 相关阅读:
    Java异常处理和设计
    一次qps测试实践
    Alternate Task UVA
    Just Another Problem UVA
    Lattice Point or Not UVA
    Play with Floor and Ceil UVA
    Exploring Pyramids UVALive
    Cheerleaders UVA
    Triangle Counting UVA
    Square Numbers UVA
  • 原文地址:https://www.cnblogs.com/sky-stars/p/11198232.html
Copyright © 2020-2023  润新知