LOJ10019生日蛋糕
Mr.W 要制作一个体积为 N*π 的 M 层生日蛋糕,每层都是一个圆柱体。
设从下往上数第 i 蛋糕是半径为 R_i,高度为 H_i 的圆柱。当 i<M 时,要求 R_i>R_{i+1} 且 H_i>H_{i+1} 。由于要在蛋糕上抹奶油,为尽可能节约经费,我们希望蛋糕外表面(最下一层的下底面除外)的面积 Q 最小。
令Q=S π ,请编程对给出的 N 和 M ,找出蛋糕的制作方案(适当的 R_i 和 H_i 的值),使 S 最小。(除 Q 外,以上所有数据皆为正整数)
输入格式
第一行为 N ,表示待制作的蛋糕的体积为Nπ ;
第二行为 M ,表示蛋糕的层数为 M 。
输出格式
输出仅一行,一个整数 S(若无解则 S=0 )。
样例
对于全部数据N<=1E4,M<=20。
________________________________________
重新做了一下,几乎所有的剪枝都想到了,可是搜索顺序还是出问题了!
第34、35行如果从小到大循环就会挂掉20分!
为什么!!!???
________________________________________
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,m; 4 int ans=0x7fffffff; 5 int vv[25],ss[25]; 6 inline void dfs(int c,int r,int h,int v,int s) 7 { 8 9 10 if(c==m+1 && 0==v && s<ans) 11 { 12 ans=s; 13 return ; 14 } 15 if(c>m)return; 16 if(r*r*h+vv[c+1]>v)return ; 17 if(r*r*h*(m-c+1)<v)return; 18 if(s+r*2*h+ss[c+1]>=ans)return ; 19 20 for(int i=r-1;i>=m-c;--i) 21 for(int j=h-1;j>=m-c;--j) 22 dfs(c+1,i,j,v-r*r*h,s+2*r*h); 23 } 24 int main() 25 { 26 scanf("%d%d",&n,&m); 27 int nn=sqrt(n); 28 for(int i=m;i>=1;--i) 29 { 30 int ii=m-i+1; 31 vv[i]=vv[i+1]+ii*ii*ii; 32 ss[i]=ss[i+1]+2*ii*ii; 33 } 34 for(int i=nn;i>=m;--i) 35 for(int j=n/(m*m);j>=m;--j) 36 dfs(1,i,j,n,i*i); 37 if(ans==0x7fffffff)ans=0; 38 printf("%d",ans); 39 return 0; 40 }