POJ1190 生日蛋糕 ACM解题报告(DFS回溯+剪枝)

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

抓狂本题整了大半个下午,由于本渣渣刚开始做搜索+剪枝,搜索就够整好久了,剪枝是更加想不到,只能百度向大神学习,整了两个多小时也算是搞明白了情况。

首先这题题目感觉是表达不清,明明就是顶层不涂奶油,底层要涂,不造我为毛理解反了,S就是底层面积+所有的侧面积,首先打表算出来1-x层的最小体积和最小面积,然后从下往上搜索,要枚举当前层可能的r和h,这个工作量是非常大的,所以必须要用剪枝。

1.当前剩余体积<当前层往上最小体积,return

2.当前最优解-当前面积<=当前层往上的最小面积,return;

3.最神奇的剪枝,直接从TLE到0ms,当前面积+2*剩余体积/当前r>=当前最优解,return;剩余体积是sigma(ri*ri*hi),将其看成和当前层一样粗细的圆柱体,乘2除以当前半径就是这个圆柱体的侧面积,而真实情况必然大于等于这种圆柱体的情况,所以可以直接pass。

下面是代码。给个数据 10000   8     答案是1532.

#include <iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n,m,temp=100000000,mv[25],ms[25],count=0;
void dfs(int v,int num,int r,int h,int s)
{
    if(num==0)
    {
        if(s<temp&&v==0) temp=s;
        return;
    }
    if(v<mv[num]||temp-s<=ms[num]||2*v/r+s>=temp)return;//三个剪枝。
    for(int r1=r; r1>=num; r1--)
    {
        if(num==m)s=r1*r1;
        int h1=min(h,v/(r1*r1));//此处我整了好久,直接用h发现跑不动,TLE,用v/(r1*r1)就会有很多上层大于下层的情况,而我一开始没				发现,有一个数据一直不过,也是醉了
        for(; h1>=num; h1--)
        {
            if(v-r1*r1*h1>=0) dfs(v-r1*r1*h1,num-1,r1-1,h1-1,s+2*r1*h1);
        }
    }
}
int main()
{
    cin>>n>>m;
    mv[0]=0;
    ms[0]=0;
    for(int i=1; i<=m; i++)
    {
        mv[i]=mv[i-1]+i*i*i;
        ms[i]=ms[i-1]+2*i*i;
    }
    dfs(n,m,n+1,n+1,0);//底层半径和高度不可能大于n吧。。。
    if(temp==100000000)printf("0\n");
    else printf("%d\n",temp);
}


Poj 1190 生日蛋糕//回溯,减枝 首先吐槽一下求面积和体积不用π。 其实不减枝的代码还是很好写的: //m为蛋糕的层数 //v为当前已涂的体积 //s为当前已涂得到的S //r和h为当前层的半径和高 void dfs(int m,int v,int s,int r,int h) { //推出条件 if(m == 0) { if(ans > s && v == N) an 阅读详情

相关推荐

POJ1190 生日蛋糕回溯法)

cuicuiv-POJ刷题 点击此处跳转原题界面---->生日蛋糕 回溯法:是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。 ——在回溯法中,每次扩大当前部分解时,都面临一个可选的状态集合,新的部分解就通过在该集合中选择构造而成。这样的状态集合,其结构是一棵多叉树,每个树结点代表一个可能的部分解,它的儿子是在它的基础上生成的其他部分解。

Lcuicui的博客 1519

POJ1190生日蛋糕

这道题减枝的要求很高。 首先很重要的一点是遍历的顺序。 建议蛋糕r和h从大到小遍历。因为这道题如果超时,肯定遍历的数据量太大。 直观的,数据量小的时候,当r和h从小到大遍历的更快。当数据量很大,r和h从大到小遍历就更快了。数据量小的时候不可能TLE的,所以r和h从大到小遍历。 既然r和h从大到小遍历,最底层的最大r和h是很好确定的。自然,从蛋糕的底层到顶层遍历最为方便。 蛋糕的总...

qq_35752161的博客 405

POJ 1190 生日蛋糕DFS+剪枝

本题是一道DFS+剪枝的经典例题,详情请看代码注释,里面按照我个人的理解进行了详细的解释

tick_tock97的博客 493

算法设计——生日蛋糕问题

jop:1190 生日蛋糕题目要求分析源代码 题目要求 要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体。设从下往上数第i(1 <= i <= M)层蛋糕是半径为R[i], 高度为H[i]的圆柱。当i < M时,要求R[i]>R[i+1]且H[i]>H[i+1]。由于要在蛋糕上抹奶油,为尽可能节约经费,希望蛋糕外表面(最下一层的下底面除外)的面积Q最小。令Q = Sπ,请编程对给出的N和M,找出蛋糕的制作方案(适当的R[i]和H[i]的值),使S最小,也就是求出蛋糕除了下

weixin_47678894的博客 1932

poj1190详细题解

题目大意:输入一个蛋糕的最大体积和最大层数 然后对于不同的半径和高计算出最小表面积 最小表面积有则打印最小表面积,没有则打印0 蛋糕的上面一层比下面一层的半径和高要大,因为都是整数 除了Q都是整数 简洁版见最后面 解析版 #include <iostream> #include <cstdio> using namespace std; //蛋糕的最大体积 蛋...

xiaozhou163的博客 579

POJ 1190 生日蛋糕

7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体。  设从下往上数第i(1 Ri+1且Hi > Hi+1。  由于要在蛋糕上抹奶油,为尽可能节约经费,我们希望蛋糕外表面(最下一层的下底面除外)的面积Q最小。  令Q = Sπ  请编程对给出的N和M,找出蛋糕的制作方案(适当的Ri和Hi的值),使S最小。 (除Q外,以上所有数据皆为正整

光明~~~ 2万+

poj 1190 生日蛋糕

poj 1190 生日蛋糕Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 17460 Accepted: 6221Description7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为NπNπ的MM层生日蛋糕,每层都是一个圆柱体。设从下往上数第i(1<=i<=M)i(1 <= i <= M)

Switch的博客 1253

poj 1190 搜索+剪枝

生日蛋糕 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12183   Accepted: 4302 Description 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体。  设从下往上数第i(1 Ri+

hange_db的专栏 822

POJ 生日蛋糕DFS 巧妙剪枝

生日蛋糕 原题链接:http://poj.org/problem?id=1190 Description 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体。  设从下往上数第i(1 Ri+1且Hi > Hi+1。  由于要在蛋糕上抹奶油,为尽可能节约经费,我们希望蛋糕外表面(最下一层的下底面除外)的面积Q最小。  令Q = Sπ

Darkarts 1778

POJ 1190 DFS+剪枝

描述 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体。 设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱。当i < M时,要求Ri > Ri+1且Hi > Hi+1。 由于要在蛋糕上抹奶油,为尽可能节约经费,我们希望蛋糕外表面(最下一层的下底面除外)的面积Q最小。 令Q = Sπ 请...

MISS假老练的博客 123

poj 1190 生日蛋糕DFS+剪枝

生日蛋糕 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12965   Accepted: 4564 Description 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体。  设从下往上数第i(1 Ri+

u014458169的专栏 560

POJ 1190 生日蛋糕 DFS

生日蛋糕 Time Limit:1000MS Memory Limit:10000K Total Submissions:18225 Accepted:6486 Description 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体。设从下往上数第i(1 <= i ...

weixin_34090643的博客 131

poj 1190 生日蛋糕(搜索剪枝

生日蛋糕Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 21876 Accepted: 7791Description7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体。设从下往上数第i(1 &lt;= i &lt;= M)层蛋糕是半径为Ri, 高度为Hi的圆柱。当i &lt; M...

zpjlkjxy的博客 179

poj 1190(剪枝)

生日蛋糕 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 16191   Accepted: 5751 Description 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体。  设从下往上数第i(1 Ri+

hexianhao的博客 401

Poj P1190 生日蛋糕___dfs

题目大意: ACM-THU为此要制作一个体积为NπNπNπ的MMM层生日蛋糕,每层都是一个圆柱体。 设从下往上数第i层蛋糕是半径为RiRiR_i, 高度为HiHiH_i的圆柱。当i&lt;Mi&lt;Mi < M时,要求Ri&gt;Ri+1Ri&gt;Ri+1R_i > R_{i+1}且Hi&gt;Hi+1Hi&gt;Hi+1H_i > H_{i+1}。 我们希望蛋糕外表面(最下一层的下底...

生如夏花之绚烂 301

poj_1190_剪枝训练

生日蛋糕 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 16428   Accepted: 5836 Description 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体。  设从下往上数第i(1 Ri+

天行健,君子以自强不息 438

POJ有关搜索的题目

一些好题目 POJ 1190生日蛋糕(基础,好题) http://acm.pku.edu.cn/JudgeOnline/problem?id=1190 题意:略 解法:dfs,题偏简单,但做出来还是有些感觉的 POJ 1376 – Robot(基础) http://acm.pku.edu.cn/JudgeOnline/problem?id=1376 题意

Uruk_Gilgamesh的博客 621

POJ搜索题目

一些好题目 POJ 1190生日蛋糕(基础,好题) http://acm.pku.edu.cn/JudgeOnline/problem?id=1190 题意:略 解法:dfs,题偏简单,但做出来还是有些感觉的 POJ 1376 – Robot(基础) htt

chengpo的专栏 1221
上一篇: POJ1068 Parencodings ACM解题报告(找规律)
下一篇: 微软面试题:飞机加油问题(智商被压制的节奏,好精妙)
Miracle_ma
博客等级 码龄12年 188粉丝 323原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值