这道题目我们使用深搜加剪枝的方法来写,我们首先算出一个最小表面积和最小体积来,就是半径从一递增,高度也从一递增,这是题目要求。

然后我们计算出一个底层最大的半径和最大的高度,我们就从这个最大半径和最大高度开始深度优先搜索,每一层的蛋糕都从最大半径开始深搜,然后内循环里面同样是对应每一层不同半径不同高度的深搜,所以就是双重循环进行搜索。

但是在搜索之前我们要进行剪枝,第一个剪枝是在边界条件里面,如果层数等于零了,但是v还不等与零,我们就直接返回,如果体积等于零了说明此方案可行,然后把它和最小表面积进行比较并赋值。

或者层数还不等于零,但是此时的体积已经小于零了,我们也直接返回。

其余的剪枝都是在for循环里面进行的,我们首先进行最优性剪枝,并且预测一下如果之前的表面积加上这层的表面积再加上之后最小的层数对应的表面积,如果此时大于了已经求得的最优表面积,我们就直接返回。

与此对应的可行性剪枝就是,如果总体积减去之前的体积,减去这层的体积,再减去之后层数的最小体积小于零的话,我们也直接返回。

如果,这层的最大半径减去层数加一小于零了,或最大高度减去层数加一小于零了,我们也直接返回,因为每层的半径和高度都要大于上一层,所以最小的公差就是一,如果最宽泛的这个顶层范围都无法满足的时候,我们就不必再搜了。

最后一个剪枝就是假设之后的每一层蛋糕都按照最大的半径和高度建造,如果这时的体积依旧要小于我们要建的体积,我们也直接返回了。

因为这个深搜的范围很宽,而且题目当中的时间限制是一秒,所以我们剪枝剪得精细一些才能过。

代码如下:

#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
int N,M;
int minArea=1<<30;
int area=0;
int minV[25];//k层及之上的蛋糕最小总体积
int minA[25];//k层及之上的蛋糕的最小表面积 void Dfs(int v,int n,int max_r,int max_h)
{
if (n==0) {
if (v!=0) {
return ;
}
else {
minArea=min(minArea,area);
return ;
}
}
if (v<0)
return ;
for (int r=max_r;r>=n;r--) {
if (n==M)
area=r*r;
for (int h=max_h;h>=n;h--) {
if (area+2*r*h>=minArea)
continue;
if (v-r*r*h-minV[n-1]<0)
continue;
if (max_r-n+1<=0||max_h-n+1<=0)
return ;
int sum=0;
for (int i=n-1;i>=0;i--) {
sum+=(r-i)*(r-i)*(h-i);
}
if (sum<v)
continue;
area+=2*r*h;
Dfs(v-r*r*h,n-1,r-1,h-1);
area-=2*r*h;
}
}
} int main()
{
cin>>N>>M;
int maxH,maxR;
memset(minV,0,sizeof(minV));
memset(minA,0,sizeof(minA));
for (int i=1;i<=20;i++) {
minA[i]=2*i*i+minA[i-1];
}//侧面积累加
for (int i=1;i<=20;i++) {
minV[i]=minV[i-1]+i*i*i;//最小体积累加
minA[i]+=i*i;//最小表面积累加
}
maxR=sqrt(N-minV[M-1]);
maxH=N-minV[M-1];
Dfs(N,M,maxR,maxH);
if (minArea==1<<30)
cout<<0<<endl;
else
cout<<minArea<<endl;
return 0;
}

POJ-1190 蛋糕问题的更多相关文章

  1. poj 1190 DFS 不等式放缩进行剪枝

    F - (例题)不等式放缩 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submi ...

  2. POJ 1190(深搜)

    http://poj.org/problem?id=1190 又有好久没做搜索的题了,没想到做一个卡了我那么久,想哭啊. 一个中文题,思路呢也就是搜索呗,一层一层往上面搜,不过这里有两个比较重要的地方 ...

  3. POJ 1190 生日蛋糕 【DFS + 极限剪枝】

    题目传送门:http://poj.org/problem?id=1190 参考剪枝:https://blog.csdn.net/nvfumayx/article/details/6653111 生日蛋 ...

  4. 生日蛋糕 POJ - 1190 搜索 数学

    http://poj.org/problem?id=1190 题解:四个剪枝. #define _CRT_SECURE_NO_WARNINGS #include<cstring> #inc ...

  5. 洛谷 P1731 [NOI1999]生日蛋糕 && POJ 1190 生日蛋糕

    题目传送门(洛谷)  OR 题目传送门(POJ) 解题思路: 一道搜索题,暴力思路比较容易想出来,但是这道题不剪枝肯定会TLE.所以这道题难点在于如何剪枝. 1.如果当前状态答案已经比我们以前某个状态 ...

  6. POJ 1190 生日蛋糕题解

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

  7. poj 1190 生日蛋糕

    中文题 题目分析 搜索题,非常好的剪枝 由于深度一定(m),所以使用深度优先搜索,自上而下的设定蛋糕序号,最顶层的为第1层,……,最底层的蛋糕为第m层,很明显满足题目条件的前i层的(从顶层(也就是编号 ...

  8. POJ 1190 生日蛋糕(DFS)

    生日蛋糕 Time Limit: 1000MSMemory Limit: 10000KB64bit IO Format: %I64d & %I64u Submit Status Descrip ...

  9. 生日蛋糕 POJ - 1190 (搜索+剪枝)

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

  10. 生日蛋糕 POJ - 1190

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

随机推荐

  1. poj 1186 方程的解数【折半dfs+hash】

    折半搜索,map会T所以用hash表来存状态 #include<iostream> #include<cstdio> #include<map> using nam ...

  2. 继续(3n+1)猜想 (25)

    #include <algorithm> #include <iostream> using namespace std; int main(){ ] = { }; ], nu ...

  3. websocket实现单聊

    server# @File: ws from flask import Flask, request, render_template from geventwebsocket.handler imp ...

  4. CF850 E. Random Elections

    题目传送门:CF 题目大意: 现有\(A,B,C\)三人参加竞选,有n个市民对其进行投票,每个市民心中对三人都有一个优先顺序(如市民\(i\)对三人的优先顺序为\(A-C-B\),则凡是有\(A\)的 ...

  5. HTML中div的悬浮标题

    <div title="我是鼠标悬停文字">我是一个DIV</div> <div class="diggao" title=&qu ...

  6. 基于node 搭建http2服务

    1.准备工作:安装node2.安装http2: npm install http2 -g安装完成后,在安装目录中appData/Roaming>npm>node_modules>ht ...

  7. discuz x2.5用户注册后邮箱认证后无法收到邮件或者直接进垃圾箱

    又是一个周末,jquery特效继续折腾我那discuz论坛,我开启了个邮箱验证,恶意注册的太恶心了,没有办法. 能稍微屏蔽点,但是问题来了,据亲们反应,无法收到验证邮件,或者有时间直接进入垃圾箱,这个 ...

  8. 关于Control.Dispatcher.BeginInvoke卡界面

    Control.Dispatcher.BeginInvoke里的逻辑由UI线程执行,如果内部包含耗时操作就会造成界面卡住. Action.BeginInvoke里的逻辑,将在一个新开的线程中执行,而不 ...

  9. PL/SQL笔记(1)-流程控制,循环,异常,块

    流程控制 1.If,then,else,elsif(不是elseif) ' then null; endif; 2.Case 简单case表达式: 搜索型Case表达式: 3.goto语句 begin ...

  10. CF779A(round 402 div.2 A) Pupils Redistribution

    题意: In Berland each high school student is characterized by academic performance — integer value bet ...