题目来源:
题目大意:
做一个体积为Nπ,M层的蛋糕,要求是下一层的R和H比上一层的大。求在给定的N、M下蛋糕最小的表面积。
做题的时候没饿,写题解的时候饿了……【。
解题思路:
dfs可行性剪枝。
一开始就想到两个简单条件,剩余的体积不够了和目前的面积大于已设定的最小面积。TLE……qaq然后再追加条件剩余的理想最大体积小于实际剩余体积。
碎碎念:说起来一开始在循环里我是先把体积自减面积自加再传递的,一直死循环【。但用两个变量存储差值在传递的时候加减就不会,当时还觉得很神奇明明式子都差不多,后来才惊觉您这是在循环里啊您循环到下一个V和S不就变了吗肯定会死循环啊【。以及蛋糕总上面积就是最底层蛋糕的上面积,咱一开始还又加又减的折腾一半天【智商清零
AC代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int n, m;
int lowS;
void cake(int nowS, int RM, int HM, int leftV, int leftM)
{
int r, h, v, a;
if (leftV<0 || (lowS && nowS>lowS) || m*(RM-1)*(HM-1)*(RM-1)<leftV)
{
return;
}
if (!leftM)
{
if (!leftV && (!lowS || nowS < lowS))
{
lowS = nowS;
}
return;
}
for (r=RM-1;r>=leftM;r--)
{
for (h=HM-1;h>=leftM;h--)
{
v = r*r*h;
a = 2*r*h;
if (leftM==m)
{
a += r*r;
}
cake(nowS+a,r,h,leftV-v,leftM-1);
}
}
}
int main()
{
scanf("%d%d",&n,&m);
lowS = 0;
cake(0,100,1000,n,m);
printf("%d\n",lowS);
return 0;
}