zoukankan      html  css  js  c++  java
  • POJ1190 生日蛋糕

    Time Limit: 1000MS   Memory Limit: 10000K
    Total Submissions: 18103   Accepted: 6439

    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

    又见花式大剪枝。

    1、从半径=n+1开始搜

    2、当前已有表面积,加上之后层的预估最小表面积,若大于最优解,减掉。

    3、当前已有体积,加上之后层的预估最小体积,若大于最优解,减掉。

    4、搜索途中,若体积超出限制,减掉(大概不会生效)

    只用上面这些,只能拿到70分(在洛谷测的)

    然后遍寻题解,找到了神奇的剪枝5:(目标体积-已有体积)/r*2+已有表面积>=ans,加上以后0ms AC,简直可怕。

     1 /*by SilverN*/
     2 #include<iostream>
     3 #include<algorithm>
     4 #include<cstring>
     5 #include<cstdio>
     6 #include<cmath>
     7 using namespace std;
     8 const int mxn=30;
     9 int ms[mxn],mv[mxn];
    10 int n,m;
    11 int ans;
    12 void DFS(int smm,int v,int dep,int h,int r){//表面积 体积 层数 高 半径 
    13     if(v>n)return;
    14     if(!dep){
    15         if(v==n && smm<ans)ans=smm;
    16         return;
    17     }
    18     if(v+mv[dep-1]>n || smm+ms[dep-1]>ans || (n-v)/r*2+smm>=ans)return;//剪枝 
    19     for(int i=r-1;i>=dep;--i){//半径 
    20         if(dep==m)smm=i*i;//上表面的总面积
    21         int mxh=min((n-v-mv[dep-1])/(i*i),h-1);
    22         for(int j=mxh;j>=dep;--j){//高度 
    23             DFS(smm+2*i*j ,v+i*i*j ,dep-1,j,i);
    24         }
    25     }
    26     return;
    27 }
    28 void init(){
    29     for(int i=1;i<=20;i++){
    30         ms[i]=ms[i-1]+i*i*2;//最小侧面积 
    31         mv[i]=mv[i-1]+i*i*i;//最小体积 
    32     }
    33     return;
    34 }
    35 int main(){
    36     init ();
    37     int i,j;
    38     scanf("%d%d",&n,&m);
    39     ans=1e9;
    40     DFS(0,0,m,n+1,n+1);
    41     if(ans==1e9)ans=0;
    42     printf("%d
    ",ans);
    43     return 0;
    44 }
  • 相关阅读:
    路径变量@PathVariable/请求参数@RequestParam的绑定以及@RequestBody
    JSR303后端校验详细笔记
    创建ssm项目步骤
    利用 R 绘制拟合曲线
    在 Linux 中将 Caps 根据是否为修饰键分别映射到 esc 和 Ctrl
    Master Transcription Factors and Mediator Establish Super-Enhancers at Key Cell Identity Genes
    Genomic Evidence for Complex Domestication History of the Cultivated Tomato in Latin America
    Variation Revealed by SNP Genotyping and Morphology Provides Insight into the Origin of the Tomato
    The genetic, developmental, and molecular bases of fruit size and shape variation in tomato
    微信支付jsapi
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/5971785.html
Copyright © 2011-2022 走看看