/* * dfs+剪枝 * 注意到:N = (ri * ri * hi)求和 *        S = r1 * r1 + (2*ri*hi)求和    (水平面面积之和第一层的半径有关) **/

#include <cstdio>#include <cmath>using namespace std;

const int INF = 10000000;const int MAXM = 20 + 5;int n, m, s;

//可以使剪枝更加精确。。 79ms->63msint min_v[MAXM];int min_s[MAXM];

void build(){    min_v[m] = 1;    min_s[m] = 1;for(int i=m-1; i>1; i--){    //第一层不管        min_v[i] = min_v[i+1] + (m-i+1) * (m-i+1) * (m-i+1);        min_s[i] = min_s[i+1] + 2 * (m-i+1) * (m-i+1);    }}

void dfs(int i, int left, int last_r, int last_h, int last_s){if(i <= m && left <= 0) return;

if(i == m+1 && left!=0) return;        //不可少

if(i == m+1 && left==0){if(last_s < s){            s = last_s;        }return;    }

if((m-i+1)*(last_r-1)*(last_r-1)*(last_h-1) < left)        //left太大,剪枝(不可少)        return;if(i!=1 && left < min_v[i]) return;                        //left太小,剪枝(可略)    if(i!=1 && last_s + min_s[i] > s) return;                //可略

//最后一层时,只要满足体积要求,则rr越大s越小,所以找到第一个后可以直接return。。  // (可略)(由于m==1时第一层s要加上r1*r1,复杂,所以不考虑)    if(i==m && m!=1){for(int rr=last_r-1; rr>0; rr--){if(left % (rr*rr) == 0){int hh = left / (rr*rr);if(hh < last_h && 2 * rr * hh + last_s < s){                        s = last_s + 2 * rr * hh; return;                }            }        }    }

for(int rr=last_r-1; rr>m-i; rr--){//hh用递增,这样后面的剪枝可以直接用break而不是continue,94ms->63ms。。        for(int hh=m-i+1; hh<last_h; hh++){//        for(int hh=last_h-1; hh>m-i; hh--){            if(i==1){if(rr * rr + 2 * rr * hh > s ) break;                dfs(i+1, left-rr*rr*hh, rr, hh, last_s+2*rr*hh+rr*rr);  //注意加上r1*r1            }else{if(2 * rr * hh + last_s >= s || left-rr*rr*hh < 0) break;                dfs(i+1, left-rr*rr*hh, rr, hh, last_s+2*rr*hh);            }

        }    }}

int main(){    scanf("%d %d", &n, &m);

    build();    s = INF;

    dfs(1, n, sqrt(n * 1.0 - m + 1) + 1, n + 2 - m, 0);

if(s == INF)        printf("0\n");else        printf("%d\n", s);

return 0;}

poj-1190 生日蛋糕 **相关推荐

  1. poj 1190 生日蛋糕

    poj 1190 生日蛋糕 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 17460 Accepted: 6221 Descri ...

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

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

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

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

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

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

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

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

  6. bailian.openjudge 1190:生日蛋糕

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

  7. poj 1190(剪枝)

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

  8. DFS--POJ 1190 生日蛋糕

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

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

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

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

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

最新文章

  1. 锦上添花DataGrid!
  2. ORB-SLAM3系列-多地图管理
  3. mybatis delete返回值_从零开始学习在IntelliJ IDEA 中使用mybatis
  4. 图神经网络新课上架:​宾大2020秋季在线课程开课,视频上线B站
  5. Xmodem恢复交换机IOS
  6. java 自定义注解
  7. Spring集成–第2节–更多世界
  8. PHP能不能让一串代码现实,一段让你认清现实的Java代码.java
  9. python爬虫app_Python爬虫:抓取手机APP的数据
  10. 微信小程序 —— 成员管理及开发管理
  11. BZOJ.3097 Hash Killer 1(卡掉自然溢出法)
  12. IE11兼容ES6语法问题
  13. LOJ#3124. 「CTS2019 | CTSC2019」氪金手游 容斥+DP
  14. matlab tecplot data,MATLAB讀取TECPLOT笛卡爾網格三維流場數據
  15. 快排之万能代理IP接口设计
  16. laravel 8控制器获取当前url
  17. Docker容器实时日志查看器Dozzle
  18. android热成像模块,Arduino制作简易热成像装置
  19. worldview卫星数据的查询方法
  20. 算数计算机音乐模拟器,Musicalculator

热门文章

  1. Xcode 12 to build a single binary with both 32-bit and 64-bit support
  2. emule学习与分析二 上 建立连接过程分析
  3. URAL 1132 Square Root(二次剩余定理)题解
  4. python面向对象中类对象、实例对象、类变量、实例变量、类方法、实例方法、静态方法...
  5. 面向对象【林老师版】:绑定方法与非绑定方法(十七)
  6. nowcoder 合并回文子串
  7. HTTPS和SSL握手过程(转载)
  8. AES加密SharePreference数据
  9. 用R语言分析我和男友的聊天记录
  10. R中数据结构与数据的输入