[ZJOI2006]碗的叠放
Description
小H有n个碗需要放进橱柜,她希望将他们叠起来放置。你知道每个碗都是规则的圆柱体,并且都是上宽下窄,你已经测量出了每个碗的两个半径及高,请你帮小H找出一种叠放顺序,使得叠放出来的碗堆的高度尽量小,比如:

Input
第一行一个整数n,表示碗的数目。以下n行,每行三个整数h,r1,r2。分别表示碗高及两个半径。
Output
仅一个数,表示最小的高度。答案四舍五入取整。
Sample Input
3
50 30 80
35 25 70
40 10 90
Sample Output
55
HINT
数据范围:100%数据满足n < = 9。所有输入的数绝对值不超过1000。
n<=9,直接想一下暴力枚举每一种放置顺序,求最小的答案即可。
那我们怎么求一种排序方案的高度呢?
分几种情况讨论:
最简单的两种:
1.如果上面的碗的碗底半径比下面的碗的碗口半径还要大(或者等于),直接卡住。
2.如果上面的碗的碗口半径比下面的碗的碗口半径还要小(或等于),可以放进去,但有可能在下底面卡住。
如果这两种情况都不是,那只能看一下碗壁的斜率了。
1.下面的碗壁大于上面的碗壁的斜率
算出在哪里是卡住的,再加上即可。
2.下面的碗壁小于等于上面的碗壁的斜率
同理。
但是有一个小情况:有可能放完碗后中间是凹下去的,这时要取得是外面的碗高。
#include<bits/stdc++.h>
using namespace std;
struct data
{
double a,b,c,d;
}a[21],b[21];
int n,c[21];
double x,y,z;
data putin(double a,double b,double c,double d)
{
data aa;
aa.a=a;
aa.b=b;
aa.c=c;
aa.d=d;
return aa;
}
double getxl(data a)
{
return (a.d-a.b)/(a.c-a.a);
}
double work(data a,data b)//两个碗放置的高度
{
double p=a.b;
if(b.a>=a.c)
{
return a.d;
}
a.b=0;
a.d-=p;
if(getxl(a)>getxl(b))
{
if(b.c>=a.c)
{
double k=a.d-(a.c-b.a)*getxl(b);
return p+max(k,0.0);
}
double k=a.d-b.d-(a.c-b.c)*getxl(a);
return p+max(k,0.0);
}else{
if(a.a>b.a)
{
return p;
}
double k=a.d-(a.c-b.a)*getxl(a);
return p+max(k,0.0);
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%lf%lf%lf",&x,&y,&z);
a[i]=putin(y,0.0,z,x);
}
for(int i=1;i<=n;i++)
{
c[i]=i;
}
double minn=1e9;
while(1)//计算每种排列的总高度
{
b[0]=putin(1e9,0.0,1e9,0.0);
for(int i=1;i<=n;i++)
{
double maxn=0;
for(int j=0;j<i;j++)
{
maxn=max(maxn,work(b[j],a[c[i]]));
}
b[i]=putin(a[c[i]].a,a[c[i]].b+maxn,a[c[i]].c,a[c[i]].d+maxn);//放好的碗
}
double maxn=0;
for(int i=1;i<=n;i++)
{
maxn=max(maxn,b[i].d);
}
minn=min(minn,maxn);
if(!next_permutation(c+1,c+n+1))//下一种排列
{
break;
}
}
printf("%.0lf\n",minn);
return 0;
}
[ZJOI2006]碗的叠放的更多相关文章
- BZOJ 1859 Luogu P2589 [ZJOI2006]碗的叠放 (计算几何)
woc, 13年前的ZJOI就这么毒瘤的嘛... 题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=1859 (luogu)ht ...
- 【BZOJ1859】【ZJOI2006】碗的叠放
题目大意:给你n个碗,求如何堆叠,使得它们的总高度最低. 首先,我们枚举碗的叠放顺序. 假设我们已经堆好了前i个碗,那么在堆第i+1个碗时,我们要将第i+1个碗与前i个碗比较,确定第i+1个碗的离地高 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- BZOJ 1862: [Zjoi2006]GameZ游戏排名系统 [treap hash]
1862: [Zjoi2006]GameZ游戏排名系统 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1318 Solved: 498[Submit][ ...
- [BZOJ1861][Zjoi2006]Book 书架
[BZOJ1861][Zjoi2006]Book 书架 试题描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候 ...
- BZOJ 1861: [Zjoi2006]Book 书架
1861: [Zjoi2006]Book 书架 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 1290 Solved: 740[Submit][Stat ...
- BZOJ1864[ZJOI2006]三色二叉树[树形DP]
1864: [Zjoi2006]三色二叉树 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 773 Solved: 548[Submit][Status] ...
- 【BZOJ1003】【ZJOI2006】物流运输
1003: [ZJOI2006]物流运输trans Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2556 Solved: 1008[Submit] ...
- [BZOJ1056][BZOJ1862][HAOI2008][Zjoi2006]排名系统
[BZOJ1056][BZOJ1862][HAOI2008][Zjoi2006]排名系统 试题描述 排名系统通常要应付三种请求:上传一条新的得分记录.查询某个玩家的当前排名以及返回某个区段内的排名记录 ...
随机推荐
- redhat 7系统服务工具-systemctl
- Azure pipeline 配置根据条件执行脚本
Azure pipeline 配置根据条件执行脚本 Intro 我的应用通过 azure pipeline 来做持续集成,之前已经介绍了根据不同分支去打包不同的package,具体的就不再这里详细介绍 ...
- CentOS 8 网卡设置
本次测试环境是在虚拟机上测试 网卡配置文件路径:/etc/sysconfig/network-scripts/ifcfg-ens33 [root@localhost ~]# cd /etc/sysco ...
- ThoughtWorks 面试三连挂,以后再也不去了
先说我吧,之前在外企呆过两年,那时Team的很多同事都去了ThoughtWorks,所以有一种情怀,只要有机会我就去面试...之前在Team里对我的评价也很高(不是我说的),现在也是公司的技术总监,总 ...
- display:box和display:flex属性介绍
1.display:box 父容器里面的box属性有box-orient|box-dirextion|box-align|box-pack|box-lines box-orient:用来确定父容器里面 ...
- java架构之路-(Redis专题)Redis的高性能和持久化
上次我们简单的说了一下我们的redis的安装和使用,这次我们来说说redis为什么那么快和持久化数据 在我们现有的redis中(5.0.*之前的版本),Redis都是单线程的,那么单线程的Redis为 ...
- BBEdit 13.0 for Mac 打开大文件不吃力
BBEdit 是一款拥有 16 年历史的 HTML 和文本编辑器,拥有高性能且流畅的文本处理能力,适用于 Web 和软件开发者,具备功能丰富且强大的智能搜索.代码折叠.FTP 和 SFTP 管理等功能 ...
- js判断是否为空和typeof的用法
(1)typeof作用用于查看数据类型 (2)typeof用法typeof 返回值类型有number, string, boolean, function, undefined, objectPS:在 ...
- PHP 组件注册的例子
<?php namespace Test; abstract class Plugin { protected $pluginName = null; abstract public funct ...
- Ubuntu16.04搭建boost环境
下载地址:http://sourceforge.net/projects/boost/files/boost/1.58.0/boost_1_58_0.tar.bz2/download 编译前所需的库 ...