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]碗的叠放的更多相关文章

  1. BZOJ 1859 Luogu P2589 [ZJOI2006]碗的叠放 (计算几何)

    woc, 13年前的ZJOI就这么毒瘤的嘛... 题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=1859 (luogu)ht ...

  2. 【BZOJ1859】【ZJOI2006】碗的叠放

    题目大意:给你n个碗,求如何堆叠,使得它们的总高度最低. 首先,我们枚举碗的叠放顺序. 假设我们已经堆好了前i个碗,那么在堆第i+1个碗时,我们要将第i+1个碗与前i个碗比较,确定第i+1个碗的离地高 ...

  3. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  4. BZOJ 1862: [Zjoi2006]GameZ游戏排名系统 [treap hash]

    1862: [Zjoi2006]GameZ游戏排名系统 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1318  Solved: 498[Submit][ ...

  5. [BZOJ1861][Zjoi2006]Book 书架

    [BZOJ1861][Zjoi2006]Book 书架 试题描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候 ...

  6. BZOJ 1861: [Zjoi2006]Book 书架

    1861: [Zjoi2006]Book 书架 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 1290  Solved: 740[Submit][Stat ...

  7. BZOJ1864[ZJOI2006]三色二叉树[树形DP]

    1864: [Zjoi2006]三色二叉树 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 773  Solved: 548[Submit][Status] ...

  8. 【BZOJ1003】【ZJOI2006】物流运输

    1003: [ZJOI2006]物流运输trans Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2556  Solved: 1008[Submit] ...

  9. [BZOJ1056][BZOJ1862][HAOI2008][Zjoi2006]排名系统

    [BZOJ1056][BZOJ1862][HAOI2008][Zjoi2006]排名系统 试题描述 排名系统通常要应付三种请求:上传一条新的得分记录.查询某个玩家的当前排名以及返回某个区段内的排名记录 ...

随机推荐

  1. Mysql高手系列 - 第21篇:什么是索引?

    Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 这是Mysql系列第21篇. 本文开始连续3篇详解mysql索引: 第1篇来说说什么是索引? 第2篇详解Mysql中 ...

  2. Weex项目快速打包

    安装最新稳定版的Node.js 运行 cnpm install -g weex-toolkit 安装Weex 官方提供的 weex-toolkit 脚手架工具到全局环境中 运行 weex create ...

  3. Docker 环境搭建(RedHat 7)

    Docker 环境搭建(RedHat 7): CentOS7 下载 http://mirrors.sohu.com/centos/7/isos/x86_64/ 装载镜像文件 安装Linux 7, 参考 ...

  4. Linux学习资料网站汇总链接(持续更新ing)

    排名不分先后. 学海无涯苦作舟. 博客: 1.slmba:LINUX博客原创大牛 2.edsionte's TechBlog:Linuxer (他的友情链接中还有一堆Linuxer,被公司屏蔽进不去. ...

  5. margin和text-align实现水平居中的区别

    1.首先text-align只应用于内联块和内联元素 text-align影响的是元素中的文本内容的对其方式(默认是left,设置为center时水平居中) 所以,将text-align设置为cent ...

  6. bugku web8

    打开网站,是一段PHP代码, <?php extract($_GET); if (!empty($ac)) { $f = trim(file_get_contents($fn)); if ($a ...

  7. python 学习之 基础篇一 python及pycharm的安装

    一. Python 环境搭建(安装请参照https://www.runoob.com/python/python-install.html) Python下载 Python官网:https://www ...

  8. netty源码解解析(4.0)-25 ByteBuf内存池:PoolArena-PoolChunk

    PoolArena实现了用于高效分配和释放内存,并尽可能减少内存碎片的内存池,这个内存管理实现使用PageRun/PoolSubpage算法.分析代码之前,先熟悉一些重要的概念: page: 页,一个 ...

  9. PHP 插入排序 -- 希尔排序

    1.希尔排序 -- Shell Insertion Sort 时间复杂度:数学家正在勤劳的探索! 适用条件: 直接插入排序的改进,主要针对移动次数的减少,这取决于"增量队列"的取值 ...

  10. SpringBoot系列:Spring Boot集成Spring Cache

    一.关于Spring Cache 缓存在现在的应用中越来越重要, Spring从3.1开始定义了org.springframework.cache.Cache和org.springframework. ...