【问题描述】

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) 题解的更多相关文章

  1. Codevs 1710 == POJ 1190 生日蛋糕 == 洛谷P1731

    生日蛋糕 时间限制: 2 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ ...

  2. 计算系数 (codevs 1137) 题解

    [问题描述] 给定一个多项式(ax + by)^k,给定a.b.k.n.m,请求出多项式展开后x^n y^m项的系数. [样例输入] 1 1 3 1 2 [样例输出] 3 [解题思路] 本题为NOIP ...

  3. 【线性规划与网络流 24题】已完成(3道题因为某些奇怪的原因被抛弃了QAQ)

    写在前面:SDOI2016 Round1滚粗后蒟蒻开始做网络流来自我拯救(2016-04-11再过几天就要考先修课,现在做网络流24题貌似没什么用←退役节奏) 做的题目将附上日期,见证我龟速刷题. 1 ...

  4. code1052 地鼠游戏

    贪心算法,从后往前 来自codevs的题解: 我的纠结思考过程:如果每一秒都没有重复的地鼠出现 那么肯定是一个一个挨着打如果有重复的地鼠 那么要考虑打那个更优 当然是选分值最大的 单纯这样想很合理 但 ...

  5. code1006 等差数列

    我绞尽脑汁想一个更好的算法,然而不能如愿,只好写一个n^3的了 很简单,就是暴力搜索(还好n<100) 先排序,然后循环i=1ton,j=i+1ton 把a[i]a[j]确定为等差数列开始的两个 ...

  6. 提高组刷题营 DAY 1 下午

    DFS 深度优先搜索 通过搜索得到一棵树形图 策略:只要能发现没走过的点,就走到它.有多个点可走就随便挑一个,如果无路可走就回退,再看有没有没走过的点可走. 在图上寻找路径[少数可用最短路解决]:最短 ...

  7. [BZOJ 3144][HNOI 2013] 切糕

    题目大意 切糕是 (p times q times r) 的长方体,每个点有一个违和感 (v_{x, y, z}).先要水平切开切糕(即对于每个纵轴,切面与其有且只有一个交点),要求水平上相邻两点的切 ...

  8. [BZOJ 1412][ZJOI 2009] 狼和羊的故事

    题目大意 有一个 (n times m) 的网格,每一个格子上是羊.狼.空地中的一种,羊和狼可以走上空地.现要在格子边上建立围栏,求把狼羊分离的最少围栏数. (1 leqslant n, ; m le ...

  9. 1710 生日蛋糕(1999 noi)

    1710 生日蛋糕(1999 noi) 1999年NOI全国竞赛 题目描述 Description 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体 ...

随机推荐

  1. div 两列布局,左侧固定宽度px,右侧自适应宽度,满屏

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...

  2. systemstate dump 介绍

    systemstate dump 介绍 By Janezhang-Oracle on 十二月 13, 2012 当数据库出现严重的性能问题或者hang了的时候,我们非常需要通过systemstate ...

  3. vc 递归删除非空文件夹

    我觉得这是一个非常不错的递归例子 头文件 #pragma once #include <atlstr.h> #include <io.h> #include <strin ...

  4. Android Activity 详述

    activity类处于android.app包中,继承关系: extends ContextThemeWrapper implements LayoutInflater.Factory2 Window ...

  5. python 2.7.10 找不到 libmysqlclient.18.dylib 解决方案

    Mac os x 升级到最新版后出现 python MysqlDB 无法找到 libmysqlclient.18.dylib 的问题,尝试的解决方案如下: 1.  升级更新 mysql 到最新版,无效 ...

  6. 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 ...

  7. 图的强连通分量-Kosaraju算法

    输入一个有向图,计算每个节点所在强连通分量的编号,输出强连通分量的个数 #include<iostream> #include<cstring> #include<vec ...

  8. 洛谷P2320 鬼谷子的钱袋

    P2320 06湖南 鬼谷子的钱袋 171通过 480提交 题目提供者xmyzwls 标签各省省选 难度普及+/提高 提交该题 讨论 题解 记录 最新讨论 题目有误 数据需要特判 评测系统太神了 题目 ...

  9. WinDBG使用之线程

    ~* 查看所有线程 ~ 0 k 查看0号线程栈回溯

  10. 百度编辑器Ueditor自动换行,添加<p>的问题

    百度编辑器Ueditor其实蛮好用的,后来使用了一段时间发现,每次打开后又保存,发现都会往内容的前后都增加一个空白的<p></p>.刚开始以后是百度编辑器的问题,找了很长时间也 ...