poj-1190 生日蛋糕 **
/* * 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 生日蛋糕 **相关推荐
- poj 1190 生日蛋糕
poj 1190 生日蛋糕 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 17460 Accepted: 6221 Descri ...
- POJ 1190 生日蛋糕 【DFS + 极限剪枝】
题目传送门:http://poj.org/problem?id=1190 参考剪枝:https://blog.csdn.net/nvfumayx/article/details/6653111 生日蛋 ...
- POJ - 1190 - 生日蛋糕 (深搜剪枝)
链接: http://poj.org/problem?id=1190 思路: 剪枝. 1.从半径n+1开始 2.当前已有表面积,加上剩余的预估最小表面积,若大于最优解,减掉.(什么是预估最小解?高度每 ...
- poj 1190 生日蛋糕 难|供自己瞻仰
7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱.当 ...
- POJ - 1190 生日蛋糕(dfs+剪枝)
题目链接:点击查看 题目大意:给出生日蛋糕的总体积,以及有多少层,我们要求下面的每一层的高度和半径都要比上面一层的大,并且都是整数,求满足要求的最小表面积 题目分析:因为题目提到了半径和高度都是整数, ...
- bailian.openjudge 1190:生日蛋糕
http://bailian.openjudge.cn/practice/1190/ 描述 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从 ...
- poj 1190(剪枝)
生日蛋糕 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16191 Accepted: 5751 Description ...
- DFS--POJ 1190 生日蛋糕
Description 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri ...
- ACM题集以及各种总结大全(转)
ACM题集以及各种总结大全! 虽然退役了,但是整理一下,供小弟小妹们以后切题方便一些,但由于近来考试太多,顾退役总结延迟一段时间再写!先写一下各种分类和题集,欢迎各位大牛路过指正. 一.ACM入门 关 ...
- ACM第七次测验(图论)
poj 1190 生日蛋糕 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 17882 Accepted: 6363 Descr ...
最新文章
- 锦上添花DataGrid!
- ORB-SLAM3系列-多地图管理
- mybatis delete返回值_从零开始学习在IntelliJ IDEA 中使用mybatis
- 图神经网络新课上架:​宾大2020秋季在线课程开课,视频上线B站
- Xmodem恢复交换机IOS
- java 自定义注解
- Spring集成–第2节–更多世界
- PHP能不能让一串代码现实,一段让你认清现实的Java代码.java
- python爬虫app_Python爬虫:抓取手机APP的数据
- 微信小程序 —— 成员管理及开发管理
- BZOJ.3097 Hash Killer 1(卡掉自然溢出法)
- IE11兼容ES6语法问题
- LOJ#3124. 「CTS2019 | CTSC2019」氪金手游 容斥+DP
- matlab tecplot data,MATLAB讀取TECPLOT笛卡爾網格三維流場數據
- 快排之万能代理IP接口设计
- laravel 8控制器获取当前url
- Docker容器实时日志查看器Dozzle
- android热成像模块,Arduino制作简易热成像装置
- worldview卫星数据的查询方法
- 算数计算机音乐模拟器,Musicalculator
热门文章
- Xcode 12 to build a single binary with both 32-bit and 64-bit support
- emule学习与分析二 上 建立连接过程分析
- URAL 1132 Square Root(二次剩余定理)题解
- python面向对象中类对象、实例对象、类变量、实例变量、类方法、实例方法、静态方法...
- 面向对象【林老师版】:绑定方法与非绑定方法(十七)
- nowcoder 合并回文子串
- HTTPS和SSL握手过程(转载)
- AES加密SharePreference数据
- 用R语言分析我和男友的聊天记录
- R中数据结构与数据的输入