• 生日蛋糕


    题目链接

    题意:给你蛋糕的总体积和有几层,且蛋糕满足从低到高一层比一层的面积小,高度低。求最小的外表面积。

    思路:因为求外表面积,实际上就是求每一层的侧面积+最底层的上表面积。然后可以算出最小的每层面积,便于剪枝,然后从下往上DFS,不断枚举高度和半径就可以解决问题。

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<iostream>
    #include<map>
    #include<vector>
    #include<queue>
    #include<cmath>
    using namespace std;
    int n,m;
    int r[25],h[25];
    int V[25],S[25];
    const int INF=1e9;
    int ans=INF;
    void dfs(int dep,int v,int s)
    {
        if(s+S[dep]>ans)
        return;
        if(2*(n-v)/r[dep+1]+s>ans)
        return;
        if(!dep)
        {
            if(v==n)
            ans=s;
            return;
        }
        for(int i=min((int)sqrt(n-v),r[dep+1]-1);i>=dep;i--)
        {
            for(int j=min((n-v)/i/i,h[dep+1]-1);j>=dep;j--)
            {
                int t=0;
                if(dep==m)
                t=i*i;
                r[dep]=i;
                h[dep]=j;
                dfs(dep-1,v+i*i*j,s+2*i*j+t);
            }
        }
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)
        {
            S[i]=S[i-1]+2*i*i;
        }
        r[m+1]=h[m+1]=1e9;
        dfs(m,0,0);
        if(ans==INF)
        ans=0;
        printf("%d
    ",ans);
    }
  • 相关阅读:
    Linux 学习 -- 修改文件的权限(chmod)
    Spring MVC
    Spring AOP与IOC
    Java学习
    SSH学习
    Android之Service
    Android之操作相册
    Android之ListView优化
    Android之Bitmap 高效加载
    Android数据储存之SQLiteDatabase SQLiteOpenHelper类的简单使用
  • 原文地址:https://www.cnblogs.com/2462478392Lee/p/11285085.html
Copyright © 2020-2023  润新知