1710 生日蛋糕(1999 noi)
1710 生日蛋糕(1999 noi)
1999年NOI全国竞赛
题目描述 Description
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 Description
有两行,第一行为N(N<=10000),表示待制作的蛋糕的体积为Nπ;第二行为M(M<=20),表示蛋糕的层数为M。
输出描述 Output Description
仅一行,是一个正整数S(若无解则S=0)。
样例输入 Sample Input
100 2
样例输出 Sample Output
68
数据范围及提示 Data Size & Hint
体积V=πR2H
侧面积A’=2πRH
底面积A=πR2
题目分析:搜索题,其实不减枝的代码还是很好写的。
参考程序:
#include<stdio.h>
#include<string.h>
#define maxn 22
#define INF 100000000
int N,M,ans,maxh;
//m为蛋糕的层数, v为当前的体积, s为当前得到的面积,r和h为当前层的半径和高
void dfs(int m,int v,int s,int r,int h){
//退出条件
if(m == 0){
if(ans > s && v == N) ans = s;
return;
}
//枚举可能的解
for(int i = r-1; i >= m; i--){
for(int j = maxh; j >= m; j--){
if(m == M) s = i * i;
dfs(m-1,v+i*i*j,s+2*i*j,i,j);
}
}
}
int main(){
scanf("%d%d",&N,&M);
ans = INF;
maxh=N/M/M;//唯一的剪枝,底层蛋糕的最大高度N/(M*M)
dfs(M,0,0,N+1,N+1);
if(ans == INF) printf("0\n");
else printf("%d\n",ans);
return 0;
}
然后就是剪枝呢,四个减枝的条件:
先打表,算出每层蛋糕的最小体积和表面积(minv[i]和mins[i]),然后在来减枝
1、v+minv[m] > V
v为已经涂的体积,那么如果v加上下一层最小的体积比总体积V还大,这显然是不可能的,减去。
2、s+min[m] > ans
s为已经涂的面积,那么s加上下一次最小的面积比当前求得的ans还大,显然不需要dfs了,减去。
3、2*(V-v)/r + s >= ans
已经涂了s,那么还剩下rest_s = sum{2*Ri*Hi} >= sum{2*Ri*Ri*Hi/Rk} = 2*(V-v)/r (设k为当前层的半径)。如果rest_s加上s大于等于ans,那么也不用在dfs了。
4、maxh = Min((N-v-minv[m-1])/(i*i),h-1)
当枚举半径为i时,当前最低的可能高为maxh = Min((N-v-minv[m-1])/(i*i),h-1)。
剪枝后的代码:
//注意:本程序蛋糕自顶向下编号(与题目相反),dfs由下向上运行.
#include<iostream>
#include<cmath>
using namespace std;
const int INF=1000000;
const int Size=22;
int N,M;
int ans;
int mins[Size],minv[Size];
int maxh;
void init(){
mins[0]=minv[0]=0;
for(int i=1;i<=M;i++){
mins[i]=mins[i-1]+2*i*i;
minv[i]=minv[i-1]+i*i*i;
}
}
void dfs(int m,int v,int s,int lastr,int lasth){
//cout<<m<<' ';
if(m==0){
if(v==N)ans=min(ans,s);
return;
}
if(v+minv[m]>N)return;
if(s+mins[m]>=ans)return;
if(2*(N-v)/lastr+s>=ans)return;
for(int r=lastr-1;r>=m;r--){
int maxh=min((N-v-minv[m-1])/(r*r),lasth-1);//注意这里是minv[m-1],因为 总体积N – 已经有的v – 将要有的最小体积minv[m+1] 才是 m这一层的最大体积,进而计算最大高度
//cout<<maxh<<endl;
for(int h=maxh;h>=m;h--){
if(m==M)s=r*r;//整个蛋糕与桌面向平的那些环面的面积之和==底层蛋糕的圆面的面积,在此加上
dfs(m-1,v+r*r*h,s+2*r*h,r,h);
}
}
}
int main(){
freopen("1.in","r",stdin);
cin>>N>>M;
ans=INF;
maxh=N/M/M;
init();
int maxr=sqrt(N);
dfs(M,0,0,maxr+1,N+1);
cout<<ans<<endl;
return 0;
}
1710 生日蛋糕(1999 noi)的更多相关文章
- 初赛Part1
计算机硬件 CPU CPU(中央处理器) = 运算器(ALC) + 控制器 + 寄存器, 主要任务是执行数据运算和程序控制. CPU的主要性能指标包括主频, 字长 ,高速缓存容量, 指令集等. 主频 ...
- 解题:NOI 1999 生日蛋糕
题面 裸的搜索题,就说剪枝(注:nw->noww->当前,res->rest->剩余): 1.想达到$Nπ$的体积,那么半径一开始最多也就$sqrt(n)$了,再大就超了... ...
- NOI题库192 生日蛋糕
192:生日蛋糕 总时间限制: 5000ms 内存限制: 65536kB 描述 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i ...
- 生日蛋糕 (codevs 1710) 题解
[问题描述] 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1<=i<=M)层蛋糕是半径为Ri,高度为Hi的圆柱 ...
- Codevs 1710 == POJ 1190 生日蛋糕 == 洛谷P1731
生日蛋糕 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ ...
- 【题解】NOI 系列题解总集
每次做一道 NOI 系列的估计都很激动吧,对于我这种萌新来说( P1731 [NOI1999]生日蛋糕 练习剪枝技巧,关于剪枝,欢迎看我的垃圾无意义笔记 这道题是有一定难度的,需要运用各种高科技剪枝( ...
- POJ1190生日蛋糕[DFS 剪枝]
生日蛋糕 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18236 Accepted: 6497 Description ...
- POJ 1190 生日蛋糕 【DFS + 极限剪枝】
题目传送门:http://poj.org/problem?id=1190 参考剪枝:https://blog.csdn.net/nvfumayx/article/details/6653111 生日蛋 ...
- POJ1190 洛谷P1731 NOI1999 生日蛋糕
生日蛋糕(蛋糕是谁?) Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 20272 Accepted: 7219 Desc ...
随机推荐
- python3之es+log+date+timezone
from dateutil.parser import parse # 使用它可以方便的将字符串解析为datetimefrom tzlocal import get_localzone # 使用它可以 ...
- 给DB2增加删除字段二三事
加字段用这个,CS.TG表名,LINE2_TYPE字段名,CHAR(1)字段类型 ALTER TABLE CS.TG ADD COLUMN LINE2_TYPE CHAR(1); 要是加错了用以下语句 ...
- 学习FPGA过程中的理论知识
学习FPGA,先要有数电知识,最好有点C语言,,学好硬件描述语言,verilog或者vhdl.在有这些基础上,做一些小的模块不断积累.这里不再赘述. 下面介绍一下关于FPGA学习过程中的一些理论知识. ...
- 【kubernetes】kubectl logs connection refused
因为启动dashboard报CrashLoopBackOff错误,尝试使用logs去查看日志,结果报错,错误如下: [root@localhost ~]# kubectl -s http://192. ...
- WindowsPhone自定义控件详解(二) - 模板类库分析
转自:http://blog.csdn.net/mr_raptor/article/details/7251948 WindowsPhone自定义控件详解(一) - 控件类库分析 上一节主要分析了控件 ...
- 【UVa】12118 Inspector's Dilemma(欧拉道路)
题目 题目 分析 很巧秒的一道题目,对着绿书瞎yy一会. 联一下必须要走的几条边,然后会形成几个联通分量,统计里面度数为奇数的点,最后再减去2再除以2.这样不断相加的和加上e再乘以t就是答案, ...
- 如何查看与分析IIS服务器日志?
发布时间:2012-12-01 16:17:28.0 作者:青岛做网站 网站日志分析是站长每天的必备工作之一,服务器的一些状况和访问IP的来源都会记录在IIS日志中,所以IIS日志对每个服务器管理 ...
- 12_java之构造方法|this|super
01构造方法引入 * A:构造方法的引入 在开发中经常需要在创建对象的同时明确对象的属性值,比如员工入职公司就要明确他的姓名.年龄等属性信息. 那么,创建对象就要明确属性值,那怎么解决呢?也就是在创建 ...
- IE6中PNG图片背景无法透明显示的最佳解决方案
我想,对于像我这样的年轻的程序员来说,做网页开发时用chrome.firefox或者ie10什么的大约是被宠坏了.所以当最近做的项目不得不在恐龙化石般的ie6上运行时,ie6种种诡异的行径简直让我发指 ...
- 直接用SQL语句把DBF导入SQLServer
直接用SQL语句把DBF导入SQLServer 在SQLServer中执行 SELECT * into bmk FROM OpenDataSource( ’Microsoft.Jet.OLEDB. ...