[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]排名系统 试题描述 排名系统通常要应付三种请求:上传一条新的得分记录.查询某个玩家的当前排名以及返回某个区段内的排名记录 ...
随机推荐
- java面试宝典2019(好东西先留着)
java面试宝典2019 1.meta标签的作用是什么 2.ReenTrantLock可重入锁(和synchronized的区别)总结 3.Spring中的自动装配有哪些限制? 4.什么是可变参数? ...
- ELK 学习笔记之 Logstash之filter配置
Logstash之filter: json filter: input{ stdin{ } } filter{ json{ source => "message" } } o ...
- 使用 Jenkins 与 Sonar 集成对代码进行持续检测
SonarQube 与 Jenkins 简介 SonarQube是 一个开源的代码质量分析平台,便于管理代码的质量,可检查出项目代码的漏洞和潜在的逻辑问题.同时,它提供了丰富的插件,支持多种语言的检测 ...
- [Swoole] 在Ubuntu下安装、快速开始
本文主要讲述在 Ubuntu 下编译安装 Swoole,并根据官方文档给出的demo进行了测试和搬运,包括:TCP服务器.UDP服务器.HTTP服务器.WebSocket服务器.异步客户端.定时器和协 ...
- Windows下如何调试驱动程序
Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 一.配置Windbg使用双机调试 win10中“windbg+vm ...
- A-07 前向分步算法
目录 前向分步算法 一.前向分步算法引入 二.前向分步算法详解 2.1 加法模型 2.2 加法模型目标函数优化问题 三.前向分步算法流程 3.1 输入 3.2 输出 3.3 流程 更新.更全的< ...
- session,cookie,sessionStorage,localStorage的相关设置以及获取删除
一.cookie 什么是 Cookie? "cookie 是存储于访问者的计算机中的变量.每当同一台计算机通过浏览器请求某个页面时,就会发送这个 cookie.你可以使用 JavaScrip ...
- Python之string模块(详细讲述string常见的所有方法)
相信不少学习python的程序员都接触过string模块 string模块主要包含关于字符串的处理函数 多说无益,初学python的小伙伴还不赶紧码起来 接下来将会讲到字符串的大小写.判断函数. 以及 ...
- MSSQL提权之xp_cmdshell
0x01 前提 getshell或者存在sql注入并且能够执行命令. sql server是system权限,sql server默认就是system权限. 0x02 xp_cmdshell 有了xp ...
- 实验吧之【who are you?】(时间盲注)补充
第二种方法 使用brup进行盲注 也是一个道理 不多贴了 这里提一下 burp怎么判断超时 Options->Connections->Tiimeouts->Normal这一空 ...