poj1190 生日蛋糕

来源:互联网 发布:免费网站域名注册 编辑:程序博客网 时间:2024/05/02 02:47
题目链接:http://poj.org/problem?id=1190

题意:m层,要求Ri > Ri+1且Hi > Hi+1,并且总体积等于n,求最小的表面积(最下一层的下底面除外)

思路:因为s = 侧面积 + 最大圆面积。可以从考虑从底层到高层或者从高层到底层搜索。

暴力搜索就别想了。。各种剪枝之后勉强过

Accepted760K47MS

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<map>#include<cmath>using namespace std;int n, m, ans, tmp, R;int minv[30], mins[30];void pre(){    ans = 1000000;    for(int i = 1; i <= 20; i++)    {        minv[i] = minv[i - 1] + i * i * i;        mins[i] = mins[i - 1] + 2 * i * i;    }}void DFS(int r, int h, int sp, int level, int vol){    if(vol + minv[level] > n || sp + mins[level] > ans || 2 * (n - vol) / r + sp >= ans)    {        return;    }    if(level == 0 )    {        if(vol == n)            ans = min(ans, sp);        return;    }    for(int i = r - 1; i >= level ; i--)    {        for(int j = h - 1; j >= level ; j--)        {            level == m ? tmp = 1: tmp = 0;            DFS(i, j, sp + 2 * i * j + tmp * i * i, level - 1, vol + i * i * j);        }    }}int main(){    pre();    scanf("%d %d", &n, &m);    DFS(sqrt(n) + 1, n + 1, 0, m, 0);    if(ans == 1000000)        cout << 0 << endl;    else        cout << ans << endl;    return 0;}

原创粉丝点击