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;
}
浙公网安备 33010602011771号