信息学奥赛一本通T1441-生日蛋糕 - C语言网 (dotcpp.com)
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int N=1e5+100;
int n,m;
int res=1e9;
void dfs(int spv,int cnt,int r,int h,int sarea)
//spv:剩余的体积,cnt:第几层,r:半径,h:高,sarea:当前表面积和
{
if(spv<0||sarea>=res)
return;
if(r*r*h*(m-cnt+1)<spv)
return;
//以此时的半径和高算出来剩余层数的总体积比做蛋糕用的剩余体积还小,后面的半径和高都不会满足了
if(cnt>m)
{
if(spv>0)//还有剩余的体积
return;
res=min(res,sarea);
return;
}
for(int i=r-1;i>=m-cnt+1;i--)
{
for(int j=h-1;j>=m-cnt+1;j--)
{
dfs(spv-i*i*j,cnt+1,i,j,sarea+2*i*j);
}
}
}
signed main()
{
cin>>n>>m;
//最底层的体积r*r*h不超过n
for(int r=sqrt(n);r>=m;r--)//半径从大到小枚举
{
for(int h=n/(r*r);h>=m;h--)//高从大到小枚举
{
dfs(n-r*r*h,2,r,h,r*r+2*r*h);
}
}
if(res!=1e9)
cout<<res;
else
cout<<0;
return 0;
}