```
算法训练 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相关推荐

  1. PIE SDK算法的自定义扩展

    1.算法功能简介 算法的自定义扩展允许用户自主开发新的算法.自定义的算法必须实现PIE.SystemAlgo.BaseSystemAlgo基础类,这样才能被PIE的算法管理器调用起来. 2.算法功能实 ...

  2. CNN阴影去除--DeshadowNet: A Multi-context Embedding Deep Network for Shadow Removal

    DeshadowNet: A Multi-context Embedding Deep Network for Shadow Removal CVPR2017 本文使用深度学习CNN网络来进行阴影去除 ...

  3. 深度去雨--Deep Joint Rain Detection and Removal from a Single Image

    CVPR 2017 https://arxiv.org/abs/1609.07769?context=cs 文中说代码和模型会公布的. 首先通过下图感性认识一下图像中去雨是怎么回事 针对去雨问题已经提 ...

  4. “XXXXX” is damaged and can’t be opened. You should move it to the Trash 解决方案

    苹果为了我们的软件安全也是操碎了心,很多小伙伴发现下载自各种第三方的软件在使用时都会弹出: "XXXXX" is damaged and can't be opened. You ...

  5. HDFS 的Trash回收站功能的配置、使用

    文件的删除和恢复  和Linux系统的回收站设计一样,HDFS会为每一个用户创建一个回收站目录:/user/用户名/.Trash/,每一个被用户通过Shell删除的文件/目录,在系统回收站中都一个周期 ...

  6. 已解决: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 ...

  7. boost::fibers::algo::shared_work >用法的测试程序

    boost::fibers::algo::shared_work >用法的测试程序 实现功能 C++实现代码 实现功能 boost::fibers::algo::shared_work > ...

  8. 论文阅读计划2(Deep Joint Rain Detection and Removal from a Single Image)

    Deep Joint Rain Detection and Removal from a Single Image[1] 简介:多任务全卷积从单张图片中去除雨迹.本文在现有的模型上,开发了一种多任务深 ...

  9. Codeforses 185 A Plant 思维 规律

    题目链接: http://codeforces.com/problemset/problem/185/A 题目描述: 给你一个三角形,每次在上三角形中画一个下三角形, 在下三角形中画一个上三角形, 求 ...

最新文章

  1. ATM高层定义了4类业务,压缩视频信号的传送属于______。B
  2. ubuntu中设置mysql的字符集
  3. 计算机专业新老生交流会ppt,铜陵学院实践部新老生交流会.ppt
  4. 在apache访问日志中统计统计前十名pv
  5. MybatisPlus实现乐观锁
  6. 主机与虚拟机桥接出现ping不通解决方案
  7. HDU.4352.XHXJ's LIS(数位DP 状压 LIS)
  8. java面试之反射机制
  9. W3School 离线手册最新版下载
  10. 苹果App Store商店中国区如何改为美国区
  11. 美国计算机专业大学排名前30,美国计算机专业研究生大学排名TOP30
  12. 华为交换机、路由器流量统计
  13. 华为开发者大会2022,发布鸿蒙开发套件
  14. Java编写的教室管理系统 带详细设计报告 功能非常齐全 完整源码
  15. 初学者做电脑的双屏显示
  16. 寿险核心业务系统哪家强
  17. ASRock B650M Riptide AMD Ryzen 7 7800X3D电脑 Hackintosh 黑苹果efi引导文件
  18. HTML 制作简单的导航栏
  19. 最大似然估计(MLE)和最大后验概率(MAP)
  20. 装机员U盘启动PE制作工具V4.0(UEFI+UD)

热门文章

  1. C# 泛型可能导致的装箱操作陷阱
  2. Win10開始菜单打不开
  3. 搭建 Visual Studio 和 Freeglut、GLEW的OpenGL环境
  4. 转载: Tortoise SVN使用方法,简易图解
  5. Android Intent 大全[转载]
  6. 基本数据类型与表达式5 - 零基础入门学习Delphi06
  7. 全国省市区县数据库脚本
  8. The 2014 ACM-ICPC Asia Mudanjiang Regional First Round A
  9. C语言-数组名真的不是指针
  10. 【C 语言】指针间接赋值 ( 指针作为 函数参数 的意义 | 间接赋值 代码示例 )