POJ1190 洛谷P1731 NOI1999 生日蛋糕
2017-08-18 11:14
295 查看
生日蛋糕(蛋糕是谁?)
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
Sample Output
Hint
圆柱公式
体积V = πR2H
侧面积A' = 2πRH
底面积A = πR2
Source
Noi 99
【题解】神搜索题。
剪枝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]
POJ1011 生日蛋糕
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 20272 | Accepted: 7219 |
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
100 2
Sample Output
68
Hint
圆柱公式
体积V = πR2H
侧面积A' = 2πRH
底面积A = πR2
Source
Noi 99
【题解】神搜索题。
剪枝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]
#include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> #include <algorithm> #include <cmath> #define min(a, b) ((a) < (b) ? (a) : (b)) #define max(a, b) ((a) > (b) ? (a) : (b)) const int MAXM = 20 + 5; const int INF = 0x3f3f3f3f; int n,ans,m,r[MAXM],h[MAXM],mis[MAXM],miv[MAXM]; void dfs(int step, int v, int s) { if(step == 0) { if(v == n) ans = min(ans, s); return; } if(s + mis[step] >= ans)return; if(v + miv[step] > n)return; if(2 * (n - v)/r[step + 1] + s >= ans)return; for(register int i = min(sqrt((double)(n - v)/step), r[step + 1] - 1);i >= step;-- i) for(register int j = min((n - v)/(i * i), h[step + 1] - 1);j >= step;-- j) { r[step] = i, h[step] = j; if(step == m)dfs(step - 1, i * i * j, i * i + 2 * i * j); else dfs(step - 1, v + i * i * j, s + 2 * i * j); r[step] = h[step] = 0; } return; } int main() { scanf("%d %d", &n, &m); for(register int i = 1;i <= m;++ i) { miv[i] = miv[i - 1] + i*i*i; mis[i] = mis[i - 1] + 2 * i * i; } r[m + 1] = h[m + 1] = INF; ans = INF; dfs(m,0,0); if(ans == INF)ans = 0; printf("%d", ans); return 0; }
POJ1011 生日蛋糕
相关文章推荐
- [POJ 1190] 生日蛋糕
- POJ 1190 生日蛋糕
- DFS:POJ1190-生日蛋糕(基础搜索)
- poj 1190 生日蛋糕
- POJ - 1190 生日蛋糕(深搜+神奇的剪枝)
- poj 1190 生日蛋糕
- POJ - 1190 生日蛋糕(深搜+剪枝)
- poj 1190 生日蛋糕
- POJ1190 生日蛋糕(DFS剪枝)
- POJ1190生日蛋糕[DFS 剪枝]
- Poj 1190 生日蛋糕 (DFS 剪枝)
- poj 1190 生日蛋糕 难|供自己瞻仰
- POJ 1190 生日蛋糕(DFS:优化剪枝)
- POJ1190 生日蛋糕 强大的dfs剪枝!!
- poj1190生日蛋糕
- poj1190 生日蛋糕 dfs神剪枝
- POJ 1190 生日蛋糕
- POJ1190-生日蛋糕
- POJ 1190 生日蛋糕 中文
- POJ 1190 生日蛋糕 估计最小答案dfs剪枝