poj 1190 生日蛋糕

Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 17460 Accepted: 6221

Description

7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为NπNπ的MM层生日蛋糕,每层都是一个圆柱体。

设从下往上数第i(1<=i<=M)i(1 层蛋糕是半径为RiR_i, 高度为HiH_i的圆柱。当i < M时,要求Ri>Ri+1R_i > R_{i+1}且Hi>Hi+1H_i > H_{i+1}。

由于要在蛋糕上抹奶油,为尽可能节约经费,我们希望蛋糕外表面(最下一层的下底面除外)的面积QQ最小。

令Q=SπQ = Sπ

请编程对给出的NN和MM,找出蛋糕的制作方案(适当的RiR_i和HiH_i的值),使SS最小。

(除QQ外,以上所有数据皆为正整数)

Input

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

Output

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

Sample Input

100
2

Sample Output

68

Hint
圆柱公式
体积V=πR2HV = πR^2H
侧面积A′=2πRHA' = 2πRH
底面积A=πR2A = πR^2

剪枝

  • 剪枝1:搭建过程中发现已建好的面积已经超过目前求得的最优表面积,或者预见到搭完后面积一定会超过目前最优表面积,则停止搭建 (最优性剪枝)

  • 剪枝2:搭建过程中预见到再往上搭,高度已经无法安排,或者半径已经无法安排,则停止搭建(可行性剪枝)

  • 剪枝3:搭建过程中发现还没搭的那些层的体积,一定会超过还缺的体积,则停止搭建(可行性剪枝)

  • 剪枝4:搭建过程中发现还没搭的那些层的体积,最大也到不了还缺的体积,则停止搭建(可行性剪枝)

#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstring>using namespace std;const int MAX_NUM = 20 + 5;
const int MAX_R = 100;
const int MAX_H = 100;
// M层,体积为N
int N, M;
// 最优化表面积
int minArea;
// 当前的表面积
int area;
// n层的最小体积
int minVolumn[MAX_NUM];
// n层的最小表面积
int minA[MAX_NUM];void init() {minVolumn[0] = 0;minA[0] = 0;for(int i = 1; i <= M; i++) {// 第i层半径至少i,高度至少iminVolumn[i] = minVolumn[i - 1] + i * i * i;minA[i] = minA[i - 1] +  2 * i * i;}
}int maxVolumns[MAX_NUM][MAX_R][MAX_H];
// m层,底层最大半径为r,最高高度为h,能凑出的最大体积
int maxVolumn(int m, int r, int h) {if(maxVolumns[m][r][h] >= 0) {return maxVolumns[m][r][h];}int volumn = 0;for(int i = 0; i < m; i++) {volumn += (r - i) * (r - i) * (h - i);}maxVolumns[m][r][h] = volumn;return maxVolumns[m][r][h];
}// 使用r半径,h高,m层的蛋糕去凑出体积v
// 同时得到最小表面积
int dfs(int v, int m, int r, int h) {// 递归出口if(m == 0) {// 剪枝,层数到了,但体积不为0if(v){return 1;} else {minArea = min(area, minArea);return 0;}}// 剪枝,体积已用完if(v < 0) {return 2;}// 剪枝,剩余m层所需要的体积要大于所拥有的总体积if(minVolumn[m] > v) {return 3;}// 剪枝,剩余m层的面积加上当前面积还大于等于当前遍历的所有状态的最小面积if(minA[m] + area >= minArea) {return 4;}// 剪枝,高度或者半径小于剩余层数if(h < m || r < m) {return 5;}// 剪枝,剩余最大的体积还是小于所需要的体积if(maxVolumn(m, r, h) < v) {return 6;}// 遍历递归for(int i = r; i >= m; i--) {// 底面积if(m == M) {area = i * i;}for(int j = h; j >= m; j--) {// 侧面积area += 2 * i * j;int flag = dfs(v - i * i * j, m - 1, i - 1, j - 1);// 回溯area -= 2 * i * j;// 剩余最大体积还是小于所需体积的话// 那么高度更小,还是回小于所需体积的if(flag == 6) {break;}}}
}int main() {cin >> N >> M;// 初始化n层的最小面积和最小体积init();// 体积大于n层的最小体积,则无法成立if(minVolumn[M] > N) {cout << 0 << endl;} else {// 底层最大高度int maxH = (N - minVolumn[M - 1]) / (M * M) + 1;// 底层最大半径int maxR = sqrt(double(N - minVolumn[M - 1]) / M) + 1;// 初始化area = 0;minArea = 1 << 30;memset(maxVolumns, -1, sizeof(maxVolumns));dfs(N, M, maxR, maxH);if(minArea == 1 << 30) {cout << 0 << endl;} else {cout << minArea << endl;}}return 0;}

poj 1190 生日蛋糕相关推荐

  1. POJ 1190 生日蛋糕 【DFS + 极限剪枝】

    题目传送门:http://poj.org/problem?id=1190 参考剪枝:https://blog.csdn.net/nvfumayx/article/details/6653111 生日蛋 ...

  2. POJ - 1190 - 生日蛋糕 (深搜剪枝)

    链接: http://poj.org/problem?id=1190 思路: 剪枝. 1.从半径n+1开始 2.当前已有表面积,加上剩余的预估最小表面积,若大于最优解,减掉.(什么是预估最小解?高度每 ...

  3. poj 1190 生日蛋糕 难|供自己瞻仰

    7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱.当 ...

  4. POJ - 1190 生日蛋糕(dfs+剪枝)

    题目链接:点击查看 题目大意:给出生日蛋糕的总体积,以及有多少层,我们要求下面的每一层的高度和半径都要比上面一层的大,并且都是整数,求满足要求的最小表面积 题目分析:因为题目提到了半径和高度都是整数, ...

  5. bailian.openjudge 1190:生日蛋糕

    http://bailian.openjudge.cn/practice/1190/ 描述 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从 ...

  6. poj 1190(剪枝)

    生日蛋糕 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 16191   Accepted: 5751 Description ...

  7. DFS--POJ 1190 生日蛋糕

    Description 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri ...

  8. ACM题集以及各种总结大全(转)

    ACM题集以及各种总结大全! 虽然退役了,但是整理一下,供小弟小妹们以后切题方便一些,但由于近来考试太多,顾退役总结延迟一段时间再写!先写一下各种分类和题集,欢迎各位大牛路过指正. 一.ACM入门 关 ...

  9. ACM第七次测验(图论)

     poj 1190 生日蛋糕 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 17882 Accepted: 6363 Descr ...

最新文章

  1. mysql双向复制(主主模式)
  2. zabbix中mysql连不上的排错_zabbix 安装及简单排错
  3. 买房贷款时为什么银行让客户选等额本息,这是不是个坑?
  4. css bug 集2
  5. d3 和echart_D3.js与echart.js的应用场景
  6. Mysql学习总结(9)——MySql视图原理讲解与使用大全
  7. 多么痛的领悟!差不多2015年的时候,我开始关注股票
  8. 怎样把win7系统下的屏幕设置成护眼的非常柔和的豆沙绿色?
  9. vc 6.0下msdev错误
  10. psd做成html叫切图吗,第一章 PSD网页切图制作HTML全过程教程.pdf
  11. Android 接入融云即时通讯踩坑
  12. xlsx.js导出表格设置批注框根据内容自动全部显示的解决办法
  13. 《Mini-Me: An Adaptive Avatar for Mixed Reality Remote Collaboration》论文笔记
  14. Ubuntu Desktop LTS - 快速显示桌面
  15. java web ip_详解Java Web如何限制访问的IP的两种方法
  16. iconfont多色图标的使用方法
  17. js关闭浏览器当前页(iframe)
  18. 东北石油计算机类专业分数线,2018年东北石油大学各省录取分数线汇总
  19. android bug unfortunately has stopped
  20. Oracle 状告 Google 侵犯专利

热门文章

  1. BGP——本地始发选路+AS-PATH选路(讲解+命令)
  2. MSTP:多生成树实例——应用案列及配置命令(实验)
  3. mvc 扫描jar jsp_SpringBoot+jsp项目启动出现404
  4. 移动Web开发基础概念
  5. 【静态站点(二)】之 Gridsome 基础
  6. 【模块化开发】之 Webpack、Rollup、Parcel
  7. 常用公共前端CDN库
  8. 算法训练营 重编码_参加编码训练营之前要考虑的7件事
  9. mcu比较器技巧和诀窍_如何准备技术面试-技巧和窍门,以帮助您表现最好
  10. 消除拖延的方法_如何消灭拖延症,并彻底消除想法