POJ-1190 蛋糕问题
这道题目我们使用深搜加剪枝的方法来写,我们首先算出一个最小表面积和最小体积来,就是半径从一递增,高度也从一递增,这是题目要求。
然后我们计算出一个底层最大的半径和最大的高度,我们就从这个最大半径和最大高度开始深度优先搜索,每一层的蛋糕都从最大半径开始深搜,然后内循环里面同样是对应每一层不同半径不同高度的深搜,所以就是双重循环进行搜索。
但是在搜索之前我们要进行剪枝,第一个剪枝是在边界条件里面,如果层数等于零了,但是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 蛋糕问题的更多相关文章
- poj 1190 DFS 不等式放缩进行剪枝
F - (例题)不等式放缩 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submi ...
- POJ 1190(深搜)
http://poj.org/problem?id=1190 又有好久没做搜索的题了,没想到做一个卡了我那么久,想哭啊. 一个中文题,思路呢也就是搜索呗,一层一层往上面搜,不过这里有两个比较重要的地方 ...
- POJ 1190 生日蛋糕 【DFS + 极限剪枝】
题目传送门:http://poj.org/problem?id=1190 参考剪枝:https://blog.csdn.net/nvfumayx/article/details/6653111 生日蛋 ...
- 生日蛋糕 POJ - 1190 搜索 数学
http://poj.org/problem?id=1190 题解:四个剪枝. #define _CRT_SECURE_NO_WARNINGS #include<cstring> #inc ...
- 洛谷 P1731 [NOI1999]生日蛋糕 && POJ 1190 生日蛋糕
题目传送门(洛谷) OR 题目传送门(POJ) 解题思路: 一道搜索题,暴力思路比较容易想出来,但是这道题不剪枝肯定会TLE.所以这道题难点在于如何剪枝. 1.如果当前状态答案已经比我们以前某个状态 ...
- POJ 1190 生日蛋糕题解
题目地址:http://poj.org/problem?id=1190 一道很有趣的搜索题--主要是剪枝-- 我弄了5个剪枝: 1.当前剩余层数>=上层半径,剪掉 2.当前剩余层数>=上层 ...
- poj 1190 生日蛋糕
中文题 题目分析 搜索题,非常好的剪枝 由于深度一定(m),所以使用深度优先搜索,自上而下的设定蛋糕序号,最顶层的为第1层,……,最底层的蛋糕为第m层,很明显满足题目条件的前i层的(从顶层(也就是编号 ...
- POJ 1190 生日蛋糕(DFS)
生日蛋糕 Time Limit: 1000MSMemory Limit: 10000KB64bit IO Format: %I64d & %I64u Submit Status Descrip ...
- 生日蛋糕 POJ - 1190 (搜索+剪枝)
7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱.当 ...
- 生日蛋糕 POJ - 1190
7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱.当 ...
随机推荐
- 洛谷 - P2805 - 植物大战僵尸 - 最大流 - 最大权闭合子图
https://www.luogu.org/problemnew/show/P2805 最大权闭合子图的特点是,假如你要选一个结点,则要先选中它的所有子节点.正权连S负权连T,容量为绝对值,原图有向边 ...
- 安装 statconn 使R与c#交互
很久以前完成过,但是最近重新折腾发现全忘了,所以记下来. 1.安装 R 2.安装 R studio 3.去 http://rcom.univie.ac.at/download.html 下载 stat ...
- poj 1723 Soldiers【中位数】By cellur925
题目传送门 题目大意:平面上有n个士兵,给出每个士兵的坐标,求出使这些士兵站好所需要的最少移动步数.站好要求:所有士兵y相等,x相邻.即达到 (x,y), (x+1, y), (x+2,y)……的状态 ...
- jmeter远程运行GUI多用户负载
1.在Jmeter控制机的bin目录下找到jmeter.properties文件并修改”remote_hosts”,增加负载机IP,多个IP使用英文逗号隔开,修改后要重启Jmeter.如下图: 2.添 ...
- hdu 2818 Building Block 种类并查集
在进行并的时候不能瞎jb并,比如(x, y)就必须把x并给y ,即fa[x] = y #include <iostream> #include <string> #includ ...
- 进程与线程(3)- python实现多线程
参考链接: https://www.jianshu.com/p/415976668b97?utm_campaign=maleskine&utm_content=note&utm_med ...
- Selenium | 基础入门 | 截屏并保存于本地
可先参考 Selenium | 基础入门 | 利用Xpath寻找用户框 核心代码: //截屏操作 File srcFile = ((TakesScreenshot)driver).getScree ...
- Math Show CodeForces - 846B
题目 题意: 有n个任务,每个任务有k个子任务,有m的时间来完成任务.每个任务的第i个子任务需要时间都是ti.完成一个子任务获得一分,完成一个大任务的所有子任务额外得一分.问如何在时间不超过m的情况下 ...
- 用eclipse-inst-win64.exe安装eclipse出现Java for Windows Missing 的原因
Java for Windows Missing 因为jdk的版本没有对,我这里是64位的机器上安了32位的jdk,所以一直报这个. 必须换上相对应版本的jdk,提示页面有链接,直接点击就可以下载. ...
- php输出中文字符
中文字符不可以使用imagettftext()函数在图片中直接输出,如果要输出中文字符,需要先使用iconv()函数对中文字符进行编码,语法格式如下:string iconv ( string $in ...