zoukankan      html  css  js  c++  java
  • POJ1190生日蛋糕[DFS 剪枝]

    生日蛋糕
    Time Limit: 1000MS   Memory Limit: 10000K
    Total Submissions: 18236   Accepted: 6497

    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 = πR2
    侧面积A' = 2πRH 
    底面积A = πR2 

    Source


    一开始想的是从上往下搜,可以用A*的估价函数剪枝(因为下面的r和h都比上面的大)
    然而题解都是递推了mnv[]和mns[]然后用他们从下往上搜
    比较神的一个剪枝是2*(n-v)/lr+s>ans
    2*(n-v)/lr这块是剩下的体积所能围成图形面积下限,因为推导一下可知圆柱v不变,侧面积与r成反比
    还有h的范围,mxh=min(lh-1,(n-mnv[d-1]-v)/(tr*tr));
     
    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <cmath>
    using namespace std;
    const int N=20;
    int n,m,ans=1e9;
    int mnv[N],mns[N];
    void init(){
        for(int i=1;i<=m;i++){
            mnv[i]=mnv[i-1]+i*i*i;
            mns[i]=mns[i-1]+2*i*i;
        }
    }
    void dfs(int d,int lh,int lr,int s,int v){
        if(d==0){
            if(v==n&&s<ans) ans=s;
            return;
        }
        if(v+mnv[d]>n||s+mns[d]>ans) return;
        if(2*(n-v)/lr+s>ans) return;
        for(int tr=lr-1;tr>=d;tr--){
            if(d==m) s=tr*tr;
            int mxh=min(lh-1,(n-mnv[d-1]-v)/(tr*tr));
            for(int th=mxh;th>=d;th--){
                dfs(d-1,th,tr,s+2*th*tr,v+tr*tr*th);
            }
        }
    }
    int main(){
        scanf("%d%d",&n,&m);
        init();
        dfs(m,n-mnv[m-1],sqrt(n-mnv[m-1])+1,0,0);
        printf("%d",ans);
    }
     
     
  • 相关阅读:
    C语言探索之旅 | 第二部分第十一课:练习题和习作
    C语言探索之旅 | 第二部分第十课: 实战"悬挂小人"游戏答案
    C语言探索之旅 | 第二部分第九课: 实战"悬挂小人"游戏
    C语言探索之旅 | 第二部分第八课:动态分配
    C语言探索之旅 | 第二部分第七课:文件读写
    最近迫切应学的编程语言
    C语言探索之旅 | 第二部分第五课:预处理
    封装axios方法之一
    react前置路由守卫
    React Router 4.0 实现路由守卫
  • 原文地址:https://www.cnblogs.com/candy99/p/6057578.html
Copyright © 2011-2022 走看看