[NOI1999]生日蛋糕
Posted Mrsrz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[NOI1999]生日蛋糕相关的知识,希望对你有一定的参考价值。
题目:洛谷P1731、Vijos P1297、codevs1710。
题目大意:让你做一个体积为$N\pi$的每层都是圆柱的蛋糕,m层,且从下到上每层的高度和半径都不超过下面一层的,且是整数。
设表面积Q=$S\pi$,问你最小的S是多少(不可能输出0)。
解题思路:搜索即可。
首先发现此题与$\pi$没什么关系,可以直接消去,我们忽略即可。
以下所讲的表面积体积均忽略$\pi$。
注意以下三种剪枝:
①当前表面积加上上面几层的最小表面积大于当前答案则退出。
②当前体积加上上面几层的最小体积大于N则退出。
③当前剩余体积全部做成与上一层半径相同的蛋糕,表面积大于当前答案则退出。
然后倒着枚举半径和高即可(倒着搜总会快那么一丁点)。
然后就完美地AC了。
C++ Code:
#include<cstdio> #include<cmath> int n,m,mv[16],ms[16],ans=0x3fffffff; void dfs(int now,int s,int v,int preh,int prer){ if(!now){ if(v==n&&ans>s)ans=s; return; } if(s+ms[now]>ans||v+mv[now]>n||s+2*(n-v)/prer>ans)return; for(int r=prer-1;r>=now;--r){ if(now==m)s=r*r; for(int h=preh-1;h>=now;--h) dfs(now-1,s+2*r*h,v+r*r*h,h,r); } } int main(){ scanf("%d%d",&n,&m); ms[0]=ms[0]=0; for(int i=1;i<=m;++i) mv[i]=mv[i-1]+i*i*i,ms[i]=ms[i-1]+((i*i)<<1); dfs(m,0,0,n,(int)(sqrt(n)+1e-9)); printf("%d\n",(ans==0x3fffffff)?0:ans); return 0; }
以上是关于[NOI1999]生日蛋糕的主要内容,如果未能解决你的问题,请参考以下文章