POJ1190 洛谷P1731 NOI1999 生日蛋糕
2024-09-06 12:57:45
生日蛋糕(蛋糕是谁?)
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外,以上所有数据皆为正整数)
设从下往上数第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
体积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 = + ;
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 == )
{
if(v == n) ans = min(ans, s);
return;
}
if(s + mis[step] >= ans)return;
if(v + miv[step] > n)return;
if( * (n - v)/r[step + ] + s >= ans)return;
for(register int i = min(sqrt((double)(n - v)/step), r[step + ] - );i >= step;-- i)
for(register int j = min((n - v)/(i * i), h[step + ] - );j >= step;-- j)
{
r[step] = i, h[step] = j;
if(step == m)dfs(step - , i * i * j, i * i + * i * j);
else dfs(step - , v + i * i * j, s + * i * j);
r[step] = h[step] = ;
}
return;
} int main()
{
scanf("%d %d", &n, &m);
for(register int i = ;i <= m;++ i)
{
miv[i] = miv[i - ] + i*i*i;
mis[i] = mis[i - ] + * i * i;
}
r[m + ] = h[m + ] = INF;
ans = INF;
dfs(m,,);
if(ans == INF)ans = ;
printf("%d", ans);
return ;
}
POJ1011 生日蛋糕
最新文章
- JS应用,表单上的一些东西
- [BI项目记]-搭建代码管理环境之云端
- excel 两列比较内容是否相同
- 使用Runtime.getRuntime().exec()在java中调用python脚本
- 网络框架 &; 云端
- Mysql-学习笔记(==》建表修改一)
- CssSpritesGenerator使用
- Oracle与SQL Server事务处理的比较
- ubuntu14.04编译mono源码(有坑...)
- Learning Lua Programming (3) iMac下搭建Lua脚本最好的编码环境(代码补全,编译运行)
- AIX LVM学习笔记
- 588. [NOIP1999] 拦截导弹
- python的学习笔记__初识函数
- ASP.Net Core开发(踩坑)指南
- UiAutomator2.0 - 与AccessibilityService的关联
- Linux中DNS的设置
- P2885 [USACO07NOV]电话线Telephone Wire
- Tag文件的创建与应用
- JavaScript基础知识点学习记录
- 2015 年度新增开源软件排名 TOP 100 - 开源中国社区
热门文章
- windows API 第13篇 MoveFileEx
- [转]用DateTime.ToString(string format)输出不同格式的日期
- PageHelper原理
- light oj 1084 线性dp
- MUI使用vue示例
- JS控制视频的播放
- ConnectionString连接字符串-密码丢失的解决方法
- 关于html 制作table的一个注意点
- Latex报错: Could not start the command: xelatex.exe -synctex=1 -interaction=nonstopmode?
- Leetcode437Path Sum III路径总和3