生日蛋糕 (codevs 1710) 题解
【问题描述】
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外,以上所有数据皆为正整数)
【样例输入】
100
2
【样例输出】
68
【解题思路】
本题为NOI1999的题目,题目的意思是让我们去搜索合适的r和h,使得s最小。我们把某一步的状态设为(i,ri,hi,si,vi),i表示从下往上数做到了第几层蛋糕,ri表示当前最上层蛋糕的半径,hi表示当前最上层蛋糕的高度,si表示当前蛋糕的表面积,vi表示做了当前蛋糕现在剩下的体积。
于是乎,由题意可知,从(i,ri,hi,si,vi)到(i+1,r(i+1),h(i+1)s(i+1),v(i+1))满足以下条件: r(i+1)<ri;h(i+1)<hi;v(i+1)=vi-r(i+1)*r(i+1)*h(i+1);s(i+1)=si+2*r(i+1)*h(i+1);
直接就这么搜索显然是不现实的,我们需要剪枝,那么,我们可以从下面几个方面想:
1:当前表面积+剩余的侧面积>当前最优值,那么我们就可以剪枝了,关键在于剩余的侧面积该怎么算。这里有一个公式,是由2*vi推出来的,余下的侧面积>=2*vi/r(i+1),因此,如果2*vi/r(i+1)+si大于当前最优值,那么我们就剪枝。这个叫做最优化剪枝。
2:若剩余的体积比做最小的蛋糕的体积还要小,就可以剪枝了,而做最小的蛋糕的体积可以用倒推法,做第m层半径为1,高也为1,那么体积为1,做第m-1层半径为2,高也为2,那么体积为8……做第i+1层就半径为m-i,高也为m-i,那么体积为(m-i)^3,因此,从1循环到m-i把体积相加,再与现在的体积比较就行了。
3:若剩余的体积比做最大的蛋糕的体积还要大,那也可以剪枝了,方法与2相同。2与3叫做可行性剪枝。
然而,这道题却是在逗我们……
你做着做着会发现,剪来剪去反而一个不好就把最佳答案给剪掉了,程序也长,最终迎来的还是红色的WA,可是,数据告诉我们,只要确定好s、h可能的值,那么只要用到最优化剪枝,便可以AC了……(经本人亲身实验,搞了一上午的剪枝,每一次都把方案给剪了,最终改了一下循环的初值和终值,去掉可行性剪枝都能轻松AC……加上可行性剪枝因为多了判断的时间反而耗时多了一点点……)这里我将两种程序都贴出来,希望哪位大神看到了能够告诉我我哪里剪错了……不胜感激。
【代码实现】
uses math;
var r,h,s,v,ans,n,m,i:longint;
procedure search(i,r,h,s,v:longint);
var a,b,c,d:longint;
begin
if i=m then
begin
if v= then
if s<ans then
ans:=s;
exit;
end;
if s+*v div r>ans then
exit;//最优化剪枝
for a:=r- downto m-i do//注意循环变量,自己去算一算,是可以到m-i的,而不是到i
for b:=min(v div (a*a),h-) downto m-i do
begin
c:=s+*a*b;
d:=v-a*a*b;
search(i+,a,b,c,d);
end;
end;
begin
readln(n);
readln(m);
s:=;
ans:=maxlongint;
for r:=m to trunc(sqrt(n)) do
for h:=n div (r*r) downto m do
begin
s:=*r*h+r*r;
v:=n-r*r*h;
search(,r,h,s,v);
end;
if ans=maxlongint then
ans:=;
writeln(ans);
end.
uses math;
var r,h,s,v,ans,n,m:longint;
procedure search(i,r,h,s,v:longint);
var a,b,c,d,mini,k:longint;
begin
mini:=;
if s+((*v) div r)>ans then
exit;//剪枝1
for k:= to m-i do
mini:=mini+k*k*k;
if v<mini then
exit;//剪枝2
mini:=;
for k:=i+ to m do
mini:=mini+sqr(r-k+i)*(h-k+i);
if v>mini then
exit;//剪枝3
if (i=m)and(v=) then
if s<ans then
begin
ans:=s;
exit;
end;
for a:=r- downto i do
for b:=min(v div (a*a),h-) downto i do
begin
c:=s+*a*b;
d:=v-a*a*b;
search(i+,a,b,c,d);
end;
end;
begin
readln(n);
readln(m);
ans:=maxlongint;
for r:=m to trunc(sqrt(n)) do
for h:=n div (r*r) downto m do
begin
s:=*r*h+r*r;
v:=n-r*r*h;
search(,r,h,s,v);
end;
if ans=maxlongint then
ans:=;
writeln(ans);
end.
生日蛋糕 (codevs 1710) 题解的更多相关文章
- Codevs 1710 == POJ 1190 生日蛋糕 == 洛谷P1731
生日蛋糕 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ ...
- 计算系数 (codevs 1137) 题解
[问题描述] 给定一个多项式(ax + by)^k,给定a.b.k.n.m,请求出多项式展开后x^n y^m项的系数. [样例输入] 1 1 3 1 2 [样例输出] 3 [解题思路] 本题为NOIP ...
- 【线性规划与网络流 24题】已完成(3道题因为某些奇怪的原因被抛弃了QAQ)
写在前面:SDOI2016 Round1滚粗后蒟蒻开始做网络流来自我拯救(2016-04-11再过几天就要考先修课,现在做网络流24题貌似没什么用←退役节奏) 做的题目将附上日期,见证我龟速刷题. 1 ...
- code1052 地鼠游戏
贪心算法,从后往前 来自codevs的题解: 我的纠结思考过程:如果每一秒都没有重复的地鼠出现 那么肯定是一个一个挨着打如果有重复的地鼠 那么要考虑打那个更优 当然是选分值最大的 单纯这样想很合理 但 ...
- code1006 等差数列
我绞尽脑汁想一个更好的算法,然而不能如愿,只好写一个n^3的了 很简单,就是暴力搜索(还好n<100) 先排序,然后循环i=1ton,j=i+1ton 把a[i]a[j]确定为等差数列开始的两个 ...
- 提高组刷题营 DAY 1 下午
DFS 深度优先搜索 通过搜索得到一棵树形图 策略:只要能发现没走过的点,就走到它.有多个点可走就随便挑一个,如果无路可走就回退,再看有没有没走过的点可走. 在图上寻找路径[少数可用最短路解决]:最短 ...
- [BZOJ 3144][HNOI 2013] 切糕
题目大意 切糕是 (p times q times r) 的长方体,每个点有一个违和感 (v_{x, y, z}).先要水平切开切糕(即对于每个纵轴,切面与其有且只有一个交点),要求水平上相邻两点的切 ...
- [BZOJ 1412][ZJOI 2009] 狼和羊的故事
题目大意 有一个 (n times m) 的网格,每一个格子上是羊.狼.空地中的一种,羊和狼可以走上空地.现要在格子边上建立围栏,求把狼羊分离的最少围栏数. (1 leqslant n, ; m le ...
- 1710 生日蛋糕(1999 noi)
1710 生日蛋糕(1999 noi) 1999年NOI全国竞赛 题目描述 Description 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体 ...
随机推荐
- div 两列布局,左侧固定宽度px,右侧自适应宽度,满屏
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...
- systemstate dump 介绍
systemstate dump 介绍 By Janezhang-Oracle on 十二月 13, 2012 当数据库出现严重的性能问题或者hang了的时候,我们非常需要通过systemstate ...
- vc 递归删除非空文件夹
我觉得这是一个非常不错的递归例子 头文件 #pragma once #include <atlstr.h> #include <io.h> #include <strin ...
- Android Activity 详述
activity类处于android.app包中,继承关系: extends ContextThemeWrapper implements LayoutInflater.Factory2 Window ...
- python 2.7.10 找不到 libmysqlclient.18.dylib 解决方案
Mac os x 升级到最新版后出现 python MysqlDB 无法找到 libmysqlclient.18.dylib 的问题,尝试的解决方案如下: 1. 升级更新 mysql 到最新版,无效 ...
- Filter Blue Light for Better Sleep(APP 推荐)
Filter Blue Light for Better Sleep By Carolyn Mohr11 May, 2016 Many people like to use their phones ...
- 图的强连通分量-Kosaraju算法
输入一个有向图,计算每个节点所在强连通分量的编号,输出强连通分量的个数 #include<iostream> #include<cstring> #include<vec ...
- 洛谷P2320 鬼谷子的钱袋
P2320 06湖南 鬼谷子的钱袋 171通过 480提交 题目提供者xmyzwls 标签各省省选 难度普及+/提高 提交该题 讨论 题解 记录 最新讨论 题目有误 数据需要特判 评测系统太神了 题目 ...
- WinDBG使用之线程
~* 查看所有线程 ~ 0 k 查看0号线程栈回溯
- 百度编辑器Ueditor自动换行,添加<p>的问题
百度编辑器Ueditor其实蛮好用的,后来使用了一段时间发现,每次打开后又保存,发现都会往内容的前后都增加一个空白的<p></p>.刚开始以后是百度编辑器的问题,找了很长时间也 ...