poj1190,DFS/已知一个等式,求另一个最小值
设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱。当i < M时,要求Ri > Ri+1且Hi > Hi+1。
由于要在蛋糕上抹奶油,为尽可能节约经费,我们希望蛋糕外表面(最下一层的下底面除外)的面积Q最小。
令Q = Sπ
请编程对给出的N和M,找出蛋糕的制作方案(适当的Ri和Hi的值),使S最小。
(除Q外,以上所有数据皆为正整数)
Input
Output
已知n=r1^2*h1+....ri^2*hi+....rm^2*hm(n,m已知,所有数为正整数),求s=r1^2+2*r1*h1+....2*ri*hi+...+2*rm*hm最小值。
DFS爆搜,+剪枝。关键是怎么减的问题,归纳如下:1,从第一个已知的减,如缩小范围,超过等,2.从目前最优的情况考虑,如果已经比目前最优差了,就不用考虑下去了!
关键剪枝说明:“假设只有一个圆柱,该圆柱的半径为r,体积为V,那么根据体积和表面积公式,可知:2 * v/r 是该圆柱的侧面积。现在我们有2个圆柱,要求这两个圆柱叠在一起之后满足题目的条件:下柱半径>上柱半径。现在把上柱往下压扁,压到和下柱的半径相等,那么根据表面积和体积公式,我们知道上柱的侧面积会减小。(s=2
* v/r,相同体积时,R大,侧面积小)所以多个圆柱叠立,假设最下面圆柱半径最大,该半径为r。于是,这些圆柱的侧面积之和>=等体积的半径为r的圆柱的侧面积。
#include<iostream>
#include<cmath>
using namespace std;
int r[21];int h[21];
int ans;
void dfs(int cur,int m,int n,int sum,int sum_ans)
{ if(cur==m+1) //注意点!先后问题!
{
if(sum==n)
{
if(sum_ans<ans)ans=sum_ans;
}
}
else
{
for(int i=m-cur+1;i<r[cur-1];i++)
for(int j=m-cur+1;j<h[cur-1];j++)
{
r[cur]=i;
h[cur]=j;
// cout<<i<<"**"<<j<<endl;
int temp=m-cur; if(sum+i*i*j+(m-cur)*r[cur]*h[cur]*r[cur]<n)continue; //体积不可能到N了。注意continue,与break 区别
if(sum+i*i*j>n)break; //体积已经大于n了。
if(sum_ans+2*i*j+2*(n-sum-i*i*j)/i>ans)break; //关键剪枝!把剩余体积全转化为表面积(按最大的转是表面积最小的情况)
if(sum_ans+2*i*j+(temp*(temp+1)*(2*temp+1)/3)>ans)break;
// 这样写不可,一次return后,这次不再还原。 sum+=i*i*j;
// if(sum>n) return ;
dfs(cur+1,m,n,sum+i*i*j,cur==1?sum_ans+2*i*j+i*i:sum_ans+2*i*j); //非也,把这层RETURN了,这层有些值还是可以的,下次循环
// sum-=i*i*j;
}
}
}
int main()
{
int n,s,m;
cin>>n>>m; ans=1000000;
r[0]=(n-m*(m-1)*(2*m-1)/6)/m;
h[0]=(n-m*(m-1)*(2*m-1)/6)/(m*m)+1;
dfs(1,m,n,0,0);
if(ans==1000000)cout<<0<<endl;
else cout<<ans<<endl; return 0;
}
poj1190,DFS/已知一个等式,求另一个最小值的更多相关文章
- 2020牛客暑期多校训练营 第二场 B Boundary 计算几何 圆 已知三点求圆心
LINK:Boundary 计算几何确实是弱项 因为好多东西都不太会求 没有到很精通的地步. 做法很多,先说官方题解 其实就是枚举一个点 P 然后可以发现 再枚举一个点 然后再判断有多少个点在圆上显然 ...
- poj 2002(好题 链式hash+已知正方形两点求另外两点)
Squares Time Limit: 3500MS Memory Limit: 65536K Total Submissions: 18493 Accepted: 7124 Descript ...
- [YY]已知逆序列求原序列(二分,树状数组)
在看组合数学,看到逆序列这个概念.于是YY了一道题:已知逆序列,求出原序列. 例子: 元素个数 n = 8 逆序列 a={5,3,4,0,2,1,1,0} 则有原序列 p={4,8,6,2,5,1,3 ...
- 【NX二次开发】三点画圆,三角形外心,已知三点求圆心
已知P1.P2.P3,求点O 算法:三点不在一条直线上时,通过连接任意两点,作中垂线.任意两条中垂线的交点是圆心.
- 已知段地址,求CPU寻址范围
已知段地址为0001H,仅通过变化偏移地址寻址,则CPU的寻址范围是? 物理地址 = 段地址×16 + 偏移地址 所以物理地址的范围是[16×1H+0H, 16×1H+FFFFH] 也就是[10H×1 ...
- poj 2242(已知三点求外接圆周长)
The Circumference of the Circle Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8310 ...
- poj 1329(已知三点求外接圆方程.)
Circle Through Three Points Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 3766 Acce ...
- 正方形已知两点对角线求另外两点(POJ2002)
至于为什么,上图.转载于MZW_BG 枚举正方形的一条边,此时有上正方形和下正方形. 最后正方形个数/4,因为每个正方形被枚举了4条边 #include <bits/stdc++.h> u ...
- 已知空间三点组成的面求该面上某点的Z值
已知空间三点,那么可以就可以确定空间三点组成的平面.此时可以根据某一点的X值和Y值,来求取该点在平面上的Z值.这个过程对于求三角面片上某点的高程或者权值特别有用,其本身也可以看作一种线性插值. 其算法 ...
随机推荐
- Android如何用阿里云的API进行身份证识别
准备工作:在libs下添加 alicloud-Android-apigateway-sdk-1.0.1.jar,commons-codec-1.10-1.jar 在build.gradle添加 co ...
- VPS环境配置预备篇
VPS买到手了,在配置环境前要做哪些操作呢?老谢说一下自己的习惯,希望对和老谢一样的菜鸟有帮助更新系统内核和rpm包#安装yum-fastestmirror插件yum -y install yum-f ...
- windows session logoff时进行处理动作
目标:Windows session logoff时得到通知,进行一些记录/清理工作 测试平台: win7 x64 logoff时系统会发送WM_ENDSESSION消息,如果某个应用对这个消息的处理 ...
- Qt获取本机IP地址
Qt获取本机IP地址: Qt版本:4.8.6 #include <QtNetwork/QNetworkInterface.h> QString ipAddr; QList<QHost ...
- xcode uml 工具
https://github.com/PaulTaykalo/objc-dependency-visualizer ./generate-objc-dependencies-to-json.rb -d ...
- Linux目录结构及详细介绍
/:根目录,位于Linux文件系统目录结构的顶层,一般根目录下只存放目录,不要存放文件,/etc./bin./dev./lib./sbin应该和根目录放置在一个分区中. /bin,/usr/bin:该 ...
- uva1442 Cav
连通器向左向右扫描两次即可每一段有水的连通区域,高度必须相同,且不超过最低天花板高度if(p[i] > level) level = p[i]; 被隔断,要上升(隔断后,之前的就不变了,之后的从 ...
- JavaEE-09 Ajax与jQuery在JavaEE项目中的使用
学习要点 JavaScript实现Ajax jQuery实现Ajax JSON JSON-LIB FastJSON JavaScript实现Ajax 认识Ajax 旧版百度地图 百度搜索自动补全 百度 ...
- WebGL 绘制Line的bug(一)
今天说点跟WebGL相关的事儿,不知道大家有没有碰到过类似的烦恼. 熟悉WebGL的同学都知道,WebGL绘制模式有点.线.面三种:通过点的绘制可以实现粒子系统等,通过线可以绘制一些连线关系:面就强大 ...
- vue 指令---气泡提示(手撸实战)
菜鸟学习之路//L6zt github 自己在造组件轮子,也就是瞎搞.自己写了个slider组件,想加个气泡提示.为了复用和省事特此写了个指令来解决.预览地址项目地址 github 我叫给它胡博 cs ...