博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ1190 洛谷P1731 NOI1999 生日蛋糕
阅读量:5148 次
发布时间:2019-06-13

本文共 2180 字,大约阅读时间需要 7 分钟。

生日蛋糕(蛋糕是谁?)
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 20272   Accepted: 7219

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

有两行,第一行为N(N <= 10000),表示待制作的蛋糕的体积为Nπ;第二行为M(M <= 20),表示蛋糕的层数为M。

Output

仅一行,是一个正整数S(若无解则S = 0)。

Sample Input

1002

Sample Output

68

Hint

圆柱公式
体积V = πR
2H
侧面积A' = 2πRH
底面积A = πR
2

Source

【题解】
神搜索题。
剪枝1:半径、高度从大到小搜
剪枝2:step层半径范围:[step,  min(sqrt((n - v)/step), r[step + 1] - 1],高度范围:[step, min((n - v)/(i * i), h[step + 1] - 1)]
剪枝3:预处理1~step层最小体积/表面积
剪枝4:不难发现到了第step层,确定了step + 1 ~ m层的体积v,想办法表示出1~step层的表面积下界,进行最优性剪枝
1 ~ step层的体积就确定了:n-v = Σr*r*h
1~step层的表面积就是:2 * Σr * h > 2 * (n - v)/h[step]
 
1 #include 
2 #include
3 #include
4 #include
5 #include
6 #include
7 #define min(a, b) ((a) < (b) ? (a) : (b)) 8 #define max(a, b) ((a) > (b) ? (a) : (b)) 9 10 const int MAXM = 20 + 5;11 const int INF = 0x3f3f3f3f;12 13 int n,ans,m,r[MAXM],h[MAXM],mis[MAXM],miv[MAXM];14 15 void dfs(int step, int v, int s)16 {17 if(step == 0)18 {19 if(v == n) ans = min(ans, s);20 return;21 }22 if(s + mis[step] >= ans)return;23 if(v + miv[step] > n)return;24 if(2 * (n - v)/r[step + 1] + s >= ans)return;25 for(register int i = min(sqrt((double)(n - v)/step), r[step + 1] - 1);i >= step;-- i)26 for(register int j = min((n - v)/(i * i), h[step + 1] - 1);j >= step;-- j)27 {28 r[step] = i, h[step] = j;29 if(step == m)dfs(step - 1, i * i * j, i * i + 2 * i * j);30 else dfs(step - 1, v + i * i * j, s + 2 * i * j);31 r[step] = h[step] = 0;32 }33 return;34 } 35 36 int main()37 {38 scanf("%d %d", &n, &m);39 for(register int i = 1;i <= m;++ i)40 {41 miv[i] = miv[i - 1] + i*i*i;42 mis[i] = mis[i - 1] + 2 * i * i;43 }44 r[m + 1] = h[m + 1] = INF;45 ans = INF;46 dfs(m,0,0);47 if(ans == INF)ans = 0;48 printf("%d", ans);49 return 0;50 }
POJ1011 生日蛋糕

 

 

转载于:https://www.cnblogs.com/huibixiaoxing/p/7388567.html

你可能感兴趣的文章
asp.net通过基类实现统一脚本和样式的管理
查看>>
『转』Bitdefender Internet Security 2013 – 免费1年
查看>>
pytorch搭建神经网络-第一篇博客
查看>>
Sublime Text 3 快捷键总结(拿走)
查看>>
return,break与continue的区别
查看>>
快排的递归和非递归C++
查看>>
微信公众平台开发(11) 发送客服消息
查看>>
MongoDB之$关键字及$修改器$set $inc $push $pull $pop
查看>>
关于对象
查看>>
CGo中传递多维数组给C函数
查看>>
android 调用系统照相机拍照后保存到系统相册,在系统图库中能看到
查看>>
ActionScript 3.0 宝典(中文PDF下载)
查看>>
Swift入门篇-集合
查看>>
Taffy自动化测试框架Web开发,Python Flask实践详解
查看>>
2019.07.15 年中备忘
查看>>
传统IO与NIO的比较
查看>>
在利用手背扫描图像+K因子 对室内温度进行回归预测时碰到的问题
查看>>
Maven笔记
查看>>
UVa 12661 (单源最短路) Funny Car Racing
查看>>
Hihocoder 1275 扫地机器人 计算几何
查看>>