• 生日蛋糕(洛谷 1731)


    题目背景

    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外,以上所有数据皆为正整数)

    题目描述

    输入输出格式

    输入格式:

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

    输出格式:

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

    输入输出样例

    输入样例#1:
    100
    2
    
    输出样例#1:
    68
    /*这个题想剪枝想的很烧脑……但都简单易懂……*/
    #include<cstdio>
    #include<iostream>
    #define lon long long
    #define M 25
    #define INF 1000000000
    using namespace std;
    int n,m,ans=INF;
    int minn[M],mn2[M];
    lon get(int r,int h,int len){
        lon tot=0;
        for(int i=1;i<=len;i++){
            tot+=(lon)(r-i+1)*(lon)(r-i+1)*(lon)(h-i+1);
        }
        return tot;
    }
    void dfs(int c,int r,int h,int v,int tot){
        
        if(tot+minn[c]>ans)return;
        lon maxn=(lon)v+get(r,h,m-c+1);
        if(maxn<(lon)n)return;
        if(v+mn2[c]>n)return;
        if(tot+2*(n-v)/(r+1)>ans)return;//这个剪枝没有想到,很巧妙
        if(c>m){
            if(v==n)
                ans=min(ans,tot);
            return;
        }
        for(int i=m-c+1;i<=r;i++){
            for(int j=m-c+1;j<=h;j++){
                if(v+i*i*j>n)break;
                if(c==1) dfs(c+1,i-1,j-1,v+i*i*j,i*i+2*i*j);
                else dfs(c+1,i-1,j-1,v+i*i*j,tot+2*i*j);
            }
        }
    }
    void init(){
        for(int i=m;i>=1;i--){
            minn[i]=2*(m-i+1)*(m-i+1);
            minn[i]+=minn[i+1];
        }
        for(int i=m;i>=1;i--){
            mn2[i]=(m-i+1)*(m-i+1)*(m-i+1);
            mn2[i]+=mn2[i+1];
        }
    }
    int main(){
        scanf("%d%d",&n,&m);
        init();
        dfs(1,n,n,0,0);
        if(ans<INF) printf("%d",ans);
        else printf("0");
        return 0;
    }
  • 相关阅读:
    Exercice_3.8
    Exercice_3.13.1_练习使用vector2
    Exercice_3.13_练习使用vetor
    Exercice_3.10_去掉string对象中的标点符号
    Exercice_3.7_判断两个字符串的大小和长度
    1-日期时间视图 2-长按事件
    View(视图)2
    View(视图)
    计算器(UI事件)给按钮添加监听器
    Activity(活动)
  • 原文地址:https://www.cnblogs.com/harden/p/6057563.html
Copyright © 2020-2023  润新知