生日蛋糕
生日蛋糕
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 20000/10000K (Java/Other)
Total Submission(s) : 11 Accepted Submission(s) : 8
Problem 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
Source
PKU
题目的意思:有一个体积为Nπ的M层蛋糕,底下每一层的高度和半径至少比上一层的大1,也是是说明,最底下一次的半径和高度至少为M了。求解符合题意
,又要求其表面积要最小的蛋糕,求出其表面积最小值为多少。依次递归用DPS去寻找符合体积大小的数据,求解找到的最小值便是答案
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <math.h> 4 int n,m,Min=200000000; /*Min表为面积最小的值,初始化为一个极大值*/ 5 void DFS(int d,int V,int S,int R,int H)/*前d层蛋糕体积为V 表面积为S 第d层半径R 高度H*/ 6 { 7 int i,j; 8 if(d==m) /**/ 9 { 10 if(V==n)Min=S; 11 return ; 12 } 13 if(V+(R-1)*(R-1)*(H-1)*(m-d)<n)/*如果当前体积加上每层的最大值还比题*/ 14 return; /*目要求的体积小,直接结束该趟递归*/ 15 if(V+m-d>n) /*如果当前体积加上每层的最小值还比题*/ 16 return; /*目要求的体积大,直接结束该趟递归*/ 17 if(2*(n-V)/R+S>=Min) /*如果求解过程半途找到比当前最小值还大的数据*/ 18 return ; /*同样直接结束该趟递归*/ 19 for(i=R-1;i>=m-d;i--) /*i(半径)的最小值要保证大于当前这一层半径的最小值*/ 20 { 21 for(j=H-1;j>=m-d;j--) /*j(高度)的最小值要保证大于当前这一层高度的最小值*/ 22 { 23 if((i*i*j+V<=n)&&(S+2*i*j<Min)) 24 DFS(d+1,V+i*i*j,S+2*i*j,i,j); 25 } 26 } 27 28 } 29 int main() 30 { 31 int i,j; 32 scanf("%d%d",&n,&m); 33 for(i=m;i*i*m<=n;i++) 34 { 35 for(j=m;i*i*j<=n;j++) 36 { 37 if(i*i+2*i*j<Min)/*如果小于最小值的话,才传入*/ 38 DFS(1,i*i*j,i*i+2*i*j,i,j); 39 } 40 } 41 printf("%d\n",Min); /*输出最小值*/ 42 return 0; 43 } 44 45 /* 46 体积V=πRRH 47 侧面积A’=2πRH 48 底面积A=πRR 49 */
转载请备注:
**************************************
* 作者: Wurq
* 博客: https://www.cnblogs.com/Wurq/
* Gitee: https://gitee.com/wurq
**************************************
**************************************
* 作者: Wurq
* 博客: https://www.cnblogs.com/Wurq/
* Gitee: https://gitee.com/wurq
**************************************

浙公网安备 33010602011771号