ALGO-185 Trash Removal
```
算法训练 Trash Removal
时间限制:1.0s 内存限制:256.0MB
问题描述
Allied Chute公司是一个建造垃圾管道的公司。垃圾管道建造在楼房中,垃圾从顶部进入,顺着管道与地下室连接。建造垃圾管道是一个高水平的工作。根据人们丢入不同种类的垃圾,垃圾管道需要有一个适当的尺寸。并且由于制作垃圾管道的费用正比于它的尺寸,公司总是想要建造尽可能的管道,尽管确定合适的尺寸十分困难。
为了简化这个问题,我们考虑一个二维的空间。垃圾管道是一个有着固定宽度、垂直下降的槽。物体可以看作一个多边形的模型。在物体落入管道之前它可以旋转来达到和管道最佳拟合。当它下落时,它会垂直落下并且不再旋转。下图展示了一个垃圾是怎样旋转来符合管道的。
你的任务是计算让一个给定的多边形物体通过的最小管道宽度。
输入格式
输入包含多组数据。每组数据开始于一个数字n,代表垃圾的模型—一个多边形的顶点数。
接下来n行每行一对整数xi和yi,按顺序给出多边形的顶点。
最后以一个0表示结束
输出格式
对于每组测试数据,输出数据编号以 及物体能够穿过垃圾管道并落下的最小宽度。输出的最小宽度并 向上舍入到最接近1/100倍数的数 ,你的答案与标准答案误差不能超过1/100。
样例输入
3
0 0
3 0
0 4
4
0 10
10 0
20 10
10 20
0
样例输出
Case 1: 2.40
Case 2: 14.15
数据规模和约定
30%的数据3<=n<=15
100%的数据3<=n<=100
0<=xi,yi<=10^4
保证在一组数据中的所有的点互不不同,并且多边形的边不会相交(技术上,两条相邻的边不可避免的会有一个公共顶点,当然,这种情况我们不认为是相交)。
```
```c++
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
struct Point {
double x, y;
Point(double a = 0, double b = 0) : x(a), y(b) {}
Point operator - (const Point &b) const {
return Point(x - b.x, y - b.y);
}
bool operator < (const Point &b) const {
return x < b.x || (x == b.x && y < b.y);
}
double norm(){//模的长度
return sqrt(x * x + y * y);
}
};
//计算a与b(向量积)的值
double cross(Point a, Point b) {
return a.x * b.y - a.y * b.x;
}
//判断b在a顺时针还是逆时针
bool IsClockWise(Point p0, Point p1, Point p2) {
if (cross(p1 - p0, p2 - p1) < 0)
return true;
else
return false;
}
//安德鲁算法(Andrew’s Algorithm)求凸包
int Andrew(Point *res, Point *p, int n) {
sort(p, p+n);
int m = 0; //凸包集合计数索引
for (int i = 0; i < n; i++) { //从左向右扫描,创建凸包的上部
while (m >= 2 && !IsClockWise(res[m-2], res[m-1], p[i]))
m--;
res[m++] = p[i];
}
int k = m;
for (int i = n - 2; i >= 0; i--) { //从n-2开始是因为n-1一定在凸包的上部分,已包含,
while (m > k && !IsClockWise(res[m-2], res[m-1], p[i]))
m--;
res[m++] = p[i];
}
if (m > 0) m--;
return m;
}
//求点到边的距离
double DistanceToLine(Point p, Point a, Point b) {
double buttom = (a-b).norm();
return fabs(cross(a-p, b-p)) / buttom;
}
int main() {
Point res[105],p[105];
int n;
int cnt = 1;
while (cin >> n && n) {
for (int i = 0; i < n; i++)
cin >> p[i].x >> p[i].y;
int m = Andrew(res, p, n);
double ans = INFINITY;
//枚举每一条边作为低,求高的最小值。i取值从0~m,形成一个换
for (int i = 0; i <= m; i++) {
double max_high = 0.0;
for (int j = 0; j < m; j++) {
max_high = max(max_high, DistanceToLine(res[j], res[i], res[(i+1)%m]));
}
ans = min(ans,max_high);
}
ans = ceil(ans * 100) / 100;
cout << "Case " << cnt++ << ": " << ans << endl;
}
return 0;
}
```
转载于:https://www.cnblogs.com/zhanyeye/p/10246592.html
ALGO-185 Trash Removal相关推荐
- PIE SDK算法的自定义扩展
1.算法功能简介 算法的自定义扩展允许用户自主开发新的算法.自定义的算法必须实现PIE.SystemAlgo.BaseSystemAlgo基础类,这样才能被PIE的算法管理器调用起来. 2.算法功能实 ...
- CNN阴影去除--DeshadowNet: A Multi-context Embedding Deep Network for Shadow Removal
DeshadowNet: A Multi-context Embedding Deep Network for Shadow Removal CVPR2017 本文使用深度学习CNN网络来进行阴影去除 ...
- 深度去雨--Deep Joint Rain Detection and Removal from a Single Image
CVPR 2017 https://arxiv.org/abs/1609.07769?context=cs 文中说代码和模型会公布的. 首先通过下图感性认识一下图像中去雨是怎么回事 针对去雨问题已经提 ...
- “XXXXX” is damaged and can’t be opened. You should move it to the Trash 解决方案
苹果为了我们的软件安全也是操碎了心,很多小伙伴发现下载自各种第三方的软件在使用时都会弹出: "XXXXX" is damaged and can't be opened. You ...
- HDFS 的Trash回收站功能的配置、使用
文件的删除和恢复 和Linux系统的回收站设计一样,HDFS会为每一个用户创建一个回收站目录:/user/用户名/.Trash/,每一个被用户通过Shell删除的文件/目录,在系统回收站中都一个周期 ...
- 已解决:Connecting to raw.githubusercontent.com |185.199.109.133|:443... Unable to establish SSL connect
1.问题描述 搭建k8s集群时,有一步需要部署flannel网络,首先需要下载一个yml文件,下载方式如下: wget https://raw.githubusercontent.com/coreos ...
- boost::fibers::algo::shared_work >用法的测试程序
boost::fibers::algo::shared_work >用法的测试程序 实现功能 C++实现代码 实现功能 boost::fibers::algo::shared_work > ...
- 论文阅读计划2(Deep Joint Rain Detection and Removal from a Single Image)
Deep Joint Rain Detection and Removal from a Single Image[1] 简介:多任务全卷积从单张图片中去除雨迹.本文在现有的模型上,开发了一种多任务深 ...
- Codeforses 185 A Plant 思维 规律
题目链接: http://codeforces.com/problemset/problem/185/A 题目描述: 给你一个三角形,每次在上三角形中画一个下三角形, 在下三角形中画一个上三角形, 求 ...
最新文章
- ATM高层定义了4类业务,压缩视频信号的传送属于______。B
- ubuntu中设置mysql的字符集
- 计算机专业新老生交流会ppt,铜陵学院实践部新老生交流会.ppt
- 在apache访问日志中统计统计前十名pv
- MybatisPlus实现乐观锁
- 主机与虚拟机桥接出现ping不通解决方案
- HDU.4352.XHXJ's LIS(数位DP 状压 LIS)
- java面试之反射机制
- W3School 离线手册最新版下载
- 苹果App Store商店中国区如何改为美国区
- 美国计算机专业大学排名前30,美国计算机专业研究生大学排名TOP30
- 华为交换机、路由器流量统计
- 华为开发者大会2022,发布鸿蒙开发套件
- Java编写的教室管理系统 带详细设计报告 功能非常齐全 完整源码
- 初学者做电脑的双屏显示
- 寿险核心业务系统哪家强
- ASRock B650M Riptide AMD Ryzen 7 7800X3D电脑 Hackintosh 黑苹果efi引导文件
- HTML 制作简单的导航栏
- 最大似然估计(MLE)和最大后验概率(MAP)
- 装机员U盘启动PE制作工具V4.0(UEFI+UD)
热门文章
- C# 泛型可能导致的装箱操作陷阱
- Win10開始菜单打不开
- 搭建 Visual Studio 和 Freeglut、GLEW的OpenGL环境
- 转载: Tortoise SVN使用方法,简易图解
- Android Intent 大全[转载]
- 基本数据类型与表达式5 - 零基础入门学习Delphi06
- 全国省市区县数据库脚本
- The 2014 ACM-ICPC Asia Mudanjiang Regional First Round A
- C语言-数组名真的不是指针
- 【C 语言】指针间接赋值 ( 指针作为 函数参数 的意义 | 间接赋值 代码示例 )