洛谷 P1731 生日蛋糕

来源:互联网 发布:网络信息安全漫画 编辑:程序博客网 时间:2024/05/22 14:48

题目背景

7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层
生日蛋糕,每层都是一个圆柱体。
设从下往上数第i(1<=i<=M)层蛋糕是半径为Ri, 高度为Hi的圆柱。当i

#include<iostream>#include<cstring>#include<cstdio>#include<cstdlib>using namespace std;const int INF = 1e9;int s[25],v[25],m,n,ans;void DFS(int mins,int minv,int level,int r,int h){    if(level==0){        if(minv==n) ans=min(ans,mins);        return;    }    if(minv+v[level-1]>n||mins+s[level-1]>ans) return ;    if(((n-minv)/r*2+mins)>ans) return ; //这句屏蔽掉会T掉两个点     //(n-minv)/r*2 剩下带搜索部分的最小面积    //mins,minv当前已搜索过的面积和体积    for(int i=r-1;i>=level;i--){        if(level==m) mins=i*i;        int hx=min((n-minv-v[level-1])/(i*i),h-1);        for(int j=hx;j>=level;j--)            DFS(mins+i*j*2,minv+i*i*j,level-1,i,j);    }}int main(){    //freopen("cake.in","r",stdin);    //freopen("cake.out","w",stdout);    ans=INF;    scanf("%d%d",&n,&m);    s[0]=v[0]=0;    for(int i=1;i<=21;i++){        s[i]=s[i-1]+2*i*i;//渚ч潰绉?        v[i]=v[i-1]+i*i*i;    }    DFS(0,0,m,n+1,n+1);    if(ans==INF) printf("%d\n",0);    else printf("%d",ans);    return 0;}
原创粉丝点击