题目链接

https://www.luogu.org/problemnew/show/P1731

分析

这题真[哔]恶心,加了一堆奇奇怪怪的优化

首先明确一点,半径和高都必须是正整数,意味着它们最小为\(1\)

同时我们通过数学公式可以推得:当剩下体积\(v\)一定时,层数越少面积越小,也就是说, 越趋进一个圆柱面积越小.

于是我们可以预处理出搜索到每一层的最小剩余体积\(miv[i]=miv[i-1]+i^3\)

假设我们从下(第m层)往上(第1层)枚举

那么我们可以列出优化:

设定初始\(r​\)范围为\([1,\sqrt{n/m}]​\),\(h​\)范围\([1,n/(m * m)]​\)

同时在\(DFS\)过程中我们枚举\(r\)从上次\(DFS\)的\(pre_r-1\)递减到现在搜索的层数\(now\),再枚举\(h\),则其上限为\(min((left-miv[now-1])/(r * r),pre_h-1)\),\(left\)是还剩下的体积,而下限也为\(now\)

同时还有剪枝

我们可以通过剩余体积\(left\)预估出接下来面积最小值(虽然可能并不能达到)为\(left * 2/pre_r\),如果预估最小值加上当前面积累计值已大于已有的答案,则直接返回;

同时相对于体积,我们已经预处理出每一层最小剩余体积,如果\(miv[now]>left\)则直接返回

代码

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cctype>
#include <queue>
#include <cmath>
#define ll long long
#define ri register int
using std::min;
using std::sqrt;
using std::max;
template <class T>inline void read(T &x){
x=0;int ne=0;char c;
while(!isdigit(c=getchar()))ne=c=='-';
x=c-48;
while(isdigit(c=getchar()))x=(x<<3)+(x<<1)+c-48;
x=ne?-x:x;return ;
}
const int maxn=17;
const int inf=0x7fffffff;
int n,m,ans=inf,tmp;
int miv[maxn];
void dfs(int now,int val,int left,int r,int h){
if(!now){
if(!left)ans=min(ans,val);
return;
}
if(now<=0||left<=0)return ;
if(val+(left<<1)/r>ans||miv[now]>left)return;
for(ri i=r-1;i>=now;i--){
if(now==m)val=i*i;
tmp=min(left-miv[now-1]/(i*i),h-1);
for(ri j=tmp;j>=now;j--){
dfs(now-1,val+2*i*j,left-i*i*j,i,j);
}
}
return;
}
int main(){
read(n),read(m);
for(ri i=1;i<=m;i++)miv[i]=miv[i-1]+i*i*i;
int r=(int)sqrt(n/m),h=n/(m*m);
dfs(m,0,n,r,h);
if(ans==inf)puts("0");
else printf("%d\n",ans);
return 0;
}

luogu1731生日蛋糕题解--恶心剪枝的更多相关文章

  1. 【题解】洛谷P1731 [NOI1999] 生日蛋糕(搜索+剪枝)

    洛谷P1731:https://www.luogu.org/problemnew/show/P1731 思路 三重剪枝 当前表面积+下一层表面积如果超过最优值就退出 当前体积+下一层体积如果超过总体积 ...

  2. 一本通例题-生日蛋糕——题解<超强深搜剪枝,从无限到有限>

    题目传送 显然是道深搜题.由于蛋糕上表面在最底层的半径确认后就确认了,所以搜索时的面积着重看侧面积. 找维度/搜索面临状态/对象:当前体积v,当前外表面面积s,各层的半径r[],各层的高度h[]. 可 ...

  3. 【POJ - 1190】生日蛋糕 (dfs+剪枝)

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

  4. 生日蛋糕 (poj1190) (dfs剪枝)

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

  5. 生日蛋糕(dfs+剪枝)

    生日蛋糕 POJ - 1190 题目: 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体.  设从下往上数第i(1 <= i <= M) ...

  6. 洛谷 P1731 [NOI1999]生日蛋糕 题解

    每日一题 day53 打卡 Analysis 观察一个蛋糕的俯视图,上表面的面积其实就是最下面那一层的底面积,所以在第一次搜索的时候加入这个底面积,之后就只用考虑侧面积就好啦. 就是每次枚举r和h,如 ...

  7. [bzoj3733]Iloczyn 题解(搜索剪枝)

    3733: [Pa2013]Iloczyn Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 741  Solved: 217[Submit][Statu ...

  8. POJ 1190 生日蛋糕题解

    题目地址:http://poj.org/problem?id=1190 一道很有趣的搜索题--主要是剪枝-- 我弄了5个剪枝: 1.当前剩余层数>=上层半径,剪掉 2.当前剩余层数>=上层 ...

  9. Join The Future (剪枝 + 状态压缩)

    一道暴力搜索的恶心剪枝题目. 先处理好某个点确定之后其他点的也确定的是谁,还有分别为什么情况,分别用vis,sta来记录.当然可以直接使用一个3进制数来表示,但是这里需要额外写一个三进制数求值的函数较 ...

随机推荐

  1. Flume-数据流监控 Ganglia

    Ganglia 由 gmond.gmetad 和 gweb 三部分组成. gmond(Ganglia Monitoring Daemon)是一种轻量级服务,安装在每台需要收集指标数据的节点主机上.使用 ...

  2. 通过OpenCL内核代码猜测设备寄存器个数

    在OpenCL标准中,没有给出查看计算设备一共有多少寄存器,至少能分配给每个work-item多少寄存器使用的特征查询.而由于一个段内核代码是否因寄存器紧缺而导致性能严重下降也是一个比较重要的因素,因 ...

  3. 新西兰程序员 ASP.NET网站中设置404自定义错误页面

    新西兰程序员 ASP.NET网站中设置404自定义错误页面 在用ASP.NET WebForm开发一个网站时,需要自定义404错误页面. 做法是这样的 在网站根目录下建立了一个404.html的错误页 ...

  4. 浏览器与NodeJS环境 eventloop异同详解(转)

    结论:浏览器中是一个宏任务,所有微任务,一个宏任务,所有微任务...           NodeJS中,一种宏任务队列所有任务,所有微任务,一种宏任务队列所有任务,所有微任务... ┌─────── ...

  5. Windows下Apache+PHP+MySQL搭建web服务器

    Apache+PHP+MySQL搭建服务器 工欲善其事必先利其器. 最近由于电脑出了问题不得不重新安装需要的文件,代码什么的都没了,以前也没怎么写过东西这回就先试试手,写的不是太好,希望大家不要介意哈 ...

  6. 超详细的EM算法理解

    众所周知,极大似然估计是一种应用很广泛的参数估计方法.例如我手头有一些东北人的身高的数据,又知道身高的概率模型是高斯分布,那么利用极大化似然函数的方法可以估计出高斯分布的两个参数,均值和方差.这个方法 ...

  7. Cocos Creator Android打包 apk

    这一篇讲的是用 Cocos Creator 编译器打包 Android APP 的时候遇到的一些问题,虽然说打包的过程不是很复杂,但是在其中还是会遇到各式各样的坑. 我们将项目用CCC(Cocos C ...

  8. linux中高级信号函数sigaction和sigqueue实例

    /************************************************************************* > File Name: sigquque. ...

  9. mui ajax传参示例

    //加入购物车var data=[];var row1 = {good_id:'1',number:'2',goods_spec_ids:[1,2]};data.push(row1);console. ...

  10. 2019牛客多校赛第一场 补题 I题

    I题  Points Division 题意: 给你n个点,每个点有坐标(xi,yi)和属性(ai,bi),将点集划分为两个集合, 任意 A 集合的点 i 和 B 集合点 j, 不允许 xi > ...