生日蛋糕(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π
请编程对给出的N和M,找出蛋糕的制作方案(适当的Ri和Hi的值),使S最小。
(除Q外,以上所有数据皆为正整数)
Input
有两行,第一行为N(N <= 10000),表示待制作的蛋糕的体积为Nπ;第二行为M(M <= 20),表示蛋糕的层数为M。
Output
仅一行,是一个正整数S(若无解则S = 0)。
Sample Input
100
2
Sample Output
68
Hint
圆柱公式
体积V = πR 2H
侧面积A' = 2πRH
底面积A = πR 2
思路:
很容易就可以知道是按照层数进行dfs。当满足层数条件以及体积条件时,找到最小的答案就可以输出了。只是为什么想把这题目写出来呢?因为这题目对时间的要求看似宽松,实则让人想吐血。写出来的dfs需要大量地剪枝,尤其是hnust的oj上对剪枝的要求简直是……太严格了。主要是需要剪枝的有三大类:
1) n+minv[m-1]>N 当前已经计算出来的蛋糕的体积,加上剩下的层数中可能制造出的最少的蛋糕的体积的结果如果大于n,剪掉。
2) sum+mins[m-1]>ans 当前已经计算出来的蛋糕的表面积,加上剩下层数中可能制造出的最少的蛋糕的表面积的结果如果大于之前计算出来的结果(ans)时,剪掉。
3) sum+2*(N-n)/r>=ans 数学公式推导:n-sumv既所剩体积记作dv 还需要的表面积为s
s=2*ri*hi+2*r(i-1)*h(i-1)+...
>=2*ri*hi*ri/r+2*r(i-1)*h(i-1)*r(i-1)/r+...
=2*dv/r(i从M-1取,r为当前半径
ri/r<1)
所以得到还需要的最小表面积s=2*(n-sum)/r,如果最小的s和已经搜索过的表面积sum依然比ans大
就不用继续搜索了
如果还是时间超限的话(例如hnust里提供的数据)就需要第四次剪枝了。
4)当前计算出来的体积,加上可能的最大的蛋糕体积的结果小于n,剪掉。这个是参考了大佬的思路,就不贴出来了,都找得到
AC代码:
#include<bits/stdc++.h> using namespace std;
int h,r,N,M,mins[],minv[];
const int inf=<<;
int ans=inf;
int sum=;
void dfs(int r,int h,int n,int m,int sum)
{
if(m==)
{
if(n==N&&sum<ans)
{
ans=sum;//cout<<r<<" "<<h<<endl;
}
return;
}
if(n+minv[m-]>N||sum+mins[m-]>ans||sum+*(N-n)/r>=ans)
return;
for(int i=r-; i>=m; i--)
{
int jl=i*i;
if(m==M)
sum=jl;
int maxh=((N-n-minv[m-])/(i*i)<h-)? (N-n-minv[m-])/(i*i):h-;
for(int j=maxh; j>=m; j--)
{
dfs(i,j,n+jl*j,m-,sum+*i*j);
}
}
}
int main()
{
minv[]=;
mins[]=;
for(int i=; i<=; i++) //从顶层向下计算出最小体积和表面积的可能值
{
//从顶层(即第一层)到第i层的最小体积minv[i]成立时第j层的半径和高度都是j
minv[i]=minv[i-]+i*i*i;
mins[i]=mins[i-]+*i*i;
}
while(scanf("%d %d",&N,&M)==)
{
ans=inf;
int rmax=(int)sqrt((double)N); //rmax初始半径 底层半径 最大值为sqrt(n)
int hmax=N; //hmax初始高度 高度最大为 n
dfs(rmax,hmax,,M,);
if(ans==inf)
cout<<<<endl;
else
cout<<ans<<endl;
}
return ;
}
生日蛋糕(dfs+剪枝)的更多相关文章
- POJ1190生日蛋糕[DFS 剪枝]
生日蛋糕 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18236 Accepted: 6497 Description ...
- [洛谷P1731][NOI1999]生日蛋糕(dfs)(剪枝)
典型的深搜+剪枝策略 我们采用可行性剪枝.上下界剪枝.优化搜索顺序剪枝.最优性剪枝的方面来帮助我们进行剪枝. 也许有人还不知道剪枝,那我就弱弱地为大家补习一下吧qwq: .优化搜索顺序: 在一些搜索问 ...
- 洛谷P1731生日蛋糕(dfs+剪枝)
P1731 生日蛋糕 题目背景 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层 生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1<=i<=M)层蛋糕是半径为R ...
- POJ - 1190 生日蛋糕 dfs+剪枝
思路:说一下最重要的剪枝,如果当前已经使用了v的体积,为了让剩下的表面积最小,最好的办法就是让R尽量大,因为V = πR 2H,A' = 2πRH,A' = V / R * 2 ,最大的R一定是取当前 ...
- 生日蛋糕 (poj1190) (dfs剪枝)
[题目描述] 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为 ...
- *HDU1455 DFS剪枝
Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- POJ 3009 DFS+剪枝
POJ3009 DFS+剪枝 原题: Curling 2.0 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16280 Acce ...
- poj 1724:ROADS(DFS + 剪枝)
ROADS Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10777 Accepted: 3961 Descriptio ...
- DFS(剪枝) POJ 1011 Sticks
题目传送门 /* 题意:若干小木棍,是由多条相同长度的长木棍分割而成,问最小的原来长木棍的长度: DFS剪枝:剪枝搜索的好题!TLE好几次,终于剪枝完全! 剪枝主要在4和5:4 相同长度的木棍不再搜索 ...
- DFS+剪枝 HDOJ 5323 Solve this interesting problem
题目传送门 /* 题意:告诉一个区间[L,R],问根节点的n是多少 DFS+剪枝:父亲节点有四种情况:[l, r + len],[l, r + len - 1],[l - len, r],[l - l ...
随机推荐
- BZOJ1185[HNOI2007] 最小矩形覆盖(旋转卡壳)
BZOJ1185[HNOI2007] 最小矩形覆盖 题面 给定一些点的坐标,要求求能够覆盖所有点的最小面积的矩形,输出所求矩形的面积和四个顶点的坐标 分析 首先可以先求凸包,因为覆盖了凸包上的顶点,凸 ...
- [常用类]时间内Date、SimpleDateFormat、Calendar类
Date类的概述是util包下的,不能导入sql包的.* 类 Date 表示特定的瞬间,精确到毫秒. *构造方法 * public Date() * public Date(long date) 如果 ...
- C# 中File和FileStream的用法
原文:https://blog.csdn.net/qq_41209575/article/details/89178020 1.首先先介绍File类和FileStream文件流 1.1 File类, ...
- C# 委托 线程 窗体假死
转载:http://www.cnblogs.com/smartls/archive/2011/04/08/2008981.html 异步调用是CLR为开发者提供的一种重要的编程手段,它也是构建高性能. ...
- 【推荐系统】知乎live入门2.细节补充
参考链接 [推荐系统]知乎live入门 目录 1. 综述 2. 召回 3. 用户画像与标签 4. 特征工程 5. 点击率预估 6. 评估 7. 数据标注 8. 推荐 ================= ...
- JavaScript、ES6中的类和对象
面向对象可以用于描述现实世界的事物,但是事物分为具体的(特指的)事物和抽象的(泛指的)事物. 面向对象思维的特点: 1.抽取(抽象)对象共有的属性和行为组织(封装)成一个类(模板) 2. ...
- h5与app交互
现在移动端 web 应用,很多时候都需要与原生 app 进行交互.沟通(运行在 webview中),比如微信的 jssdk,通过 window.wx 对象调用一些原生 app 的功能.所以,这次就来捋 ...
- kali优化配置(1)
前言 无论是工具还是物理机.虚拟机,我都遇到过惨绝人寰的配置错误.为了有效避免这些烦恼困住我,写一个排错文档之外,我还应当谨慎小心,从每一次配置走起..我的kali昨日的MySQL无法登陆,也没办法联 ...
- 浅谈协议(四)——wireshark强力解析视频流协议
参考链接: https://wenku.baidu.com/view/460f016e49d7c1c708a1284ac850ad02de800722.html https://wenku.baidu ...
- Linux手册页内容
总用9页 man1:可执行程序或shell命令 man2:系统调用(kernel提供的函数) man3:库调用(程序库中的函数) man4:/dev中的特殊文件 ...