7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为N*pi的M层生日蛋糕,每层都是一个圆柱体。 设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱。当i < M时,要求Ri > Ri+1且Hi > Hi+1。 由于要在蛋糕上抹奶油,为尽可能节约经费,我们希望蛋糕外表面(最下一层的下底面除外)的面积Q最小。 令Q = S*pi 请编程对给出的N和M,找出蛋糕的制作方案(适当的Ri和Hi的值),使S最小。(除Q外,以上所有数据皆为正整数)
//sprayoflearn #include<cstdio> #include<cmath> #include<cstring> #include<cstring> int ans=999999; int n,m,temp; int min[50]; inline int max(int r,int h,int k) { int i,p=0; for (i=1;i<=k;i++) p+=(r-i)*(r-i)*(h-i); return p; } void dfs(int v,int k,int r,int h,int s) { int ss=s,sss=s,vv=v; for (int i=r-1;i>0;i--) { if (k==1) ss=s+i*i; for (int j=1;j<h && i*i*j<=v;j++) { sss=ss+2*i*j; vv=v-i*i*j; if (vv<min[m-k]) break; if (vv>max(i,j,m-k)) continue; double tmp; tmp=3*pow((double)vv,2.0/3.0)-(i-1)*(i-1); if (tmp+sss>ans) continue; if (k<m) dfs(vv,k+1,i,j,sss); else if (sss<ans) ans=sss; } } } int main() { //freopen("cake.in","r",stdin); scanf("%d%d",&n,&m); for (int i=1;i<=m;i++) min[i]=min[i-1]+i*i*i; temp=sqrt((double)n)-m*(m-1)/2+1; dfs(n,1,temp,temp,0); printf("%d\n",ans); return 0; }