POJ3525 Most Distant Point from the Sea(半平面交)
给你一个凸多边形,问在里面距离凸边形最远的点。
方法就是二分这个距离,然后将对应的半平面沿着法向平移这个距离,然后判断是否交集为空,为空说明这个距离太大了,否则太小了,二分即可。
- #pragma warning(disable:4996)
- #include <iostream>
- #include <cstring>
- #include <cstdio>
- #include <vector>
- #include <cmath>
- #include <string>
- #include <algorithm>
- using namespace std;
- #define maxn 2500
- #define eps 1e-7
- int n;
- int dcmp(double x){
- return (x > eps) - (x < -eps);
- }
- struct Point
- {
- double x, y;
- Point(){}
- Point(double _x, double _y) :x(_x), y(_y){}
- Point operator + (const Point &b) const{
- return Point(x + b.x, y + b.y);
- }
- Point operator - (const Point &b) const{
- return Point(x - b.x, y - b.y);
- }
- Point operator *(double d) const{
- return Point(x*d, y*d);
- }
- Point operator /(double d) const{
- return Point(x / d, y / d);
- }
- double det(const Point &b) const{
- return x*b.y - y*b.x;
- }
- double dot(const Point &b) const{
- return x*b.x + y*b.y;
- }
- Point rot90(){
- return Point(-y, x);
- }
- Point norm(){
- double len=sqrt(this->dot(*this));
- return Point(x, y) / len;
- }
- void read(){
- scanf("%lf%lf", &x, &y);
- }
- };
- #define cross(p1,p2,p3) ((p2.x-p1.x)*(p3.y-p1.y)-(p3.x-p1.x)*(p2.y-p1.y))
- #define crossOp(p1,p2,p3) (dcmp(cross(p1,p2,p3)))
- Point isSS(Point p1, Point p2, Point q1, Point q2){
- double a1 = cross(q1, q2, p1), a2 = -cross(q1, q2, p2);
- return (p1*a2 + p2*a1) / (a1 + a2);
- }
- struct Border
- {
- Point p1, p2;
- double alpha;
- void setAlpha(){
- alpha = atan2(p2.y - p1.y, p2.x - p1.x);
- }
- };
- bool operator < (const Border &a,const Border &b) {
- int c = dcmp(a.alpha - b.alpha);
- if (c != 0) {
- return c == 1;
- }
- else {
- return crossOp(b.p1, b.p2, a.p1) > 0;
- }
- }
- bool operator == (const Border &a, const Border &b){
- return dcmp(a.alpha - b.alpha) == 0;
- }
- Point isBorder(const Border &a, const Border &b){
- return isSS(a.p1, a.p2, b.p1, b.p2);
- }
- Border border[maxn];
- Border que[maxn];
- int qh, qt;
- // check函数判断的是新加的半平面和由a,b两个半平面产生的交点的方向,若在半平面的左侧返回True
- bool check(const Border &a, const Border &b, const Border &me){
- Point is = isBorder(a, b);
- return crossOp(me.p1, me.p2, is) > 0;
- }
- bool convexIntersection()
- {
- qh = qt = 0;
- sort(border, border + n);
- n = unique(border, border + n) - border;
- for (int i = 0; i < n; i++){
- Border cur = border[i];
- while (qh + 1 < qt&&!check(que[qt - 2], que[qt - 1], cur)) --qt;
- while (qh + 1 < qt&&!check(que[qh], que[qh + 1], cur)) ++qh;
- que[qt++] = cur;
- }
- while (qh + 1 < qt&&!check(que[qt - 2], que[qt - 1], que[qh])) --qt;
- while (qh + 1 < qt&&!check(que[qh], que[qh + 1], que[qt - 1])) ++qh;
- return qt - qh > 2;
- }
- Point ps[maxn];
- bool judge(double x)
- {
- for (int i = 0; i < n; i++){
- border[i].p1 = ps[i];
- border[i].p2 = ps[(i + 1) % n];
- }
- for (int i = 0; i < n; i++){
- Point vec = border[i].p2 - border[i].p1;
- vec=vec.rot90().norm();
- vec = vec*x;
- border[i].p1 = border[i].p1 + vec;
- border[i].p2 = border[i].p2 + vec;
- border[i].setAlpha();
- }
- return convexIntersection();
- }
- int main()
- {
- while (cin>>n&&n)
- {
- for (int i = 0; i < n; i++){
- ps[i].read();
- }
- double l=0, r=100000000;
- while (dcmp(r-l)>0){
- double mid = (l + r) / 2;
- if (judge(mid)) l = mid;
- else r = mid;
- }
- printf("%.6lf\n", l);
- }
- return 0;
- }
POJ3525 Most Distant Point from the Sea(半平面交)的更多相关文章
- POJ 3525 Most Distant Point from the Sea [半平面交 二分]
Most Distant Point from the Sea Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 5153 ...
- LA 3890 Most Distant Point from the Sea(半平面交)
Most Distant Point from the Sea [题目链接]Most Distant Point from the Sea [题目类型]半平面交 &题解: 蓝书279 二分答案 ...
- POJ 3525 Most Distant Point from the Sea (半平面交)
Description The main land of Japan called Honshu is an island surrounded by the sea. In such an isla ...
- poj3525 Most Distant Point from the Sea
题目描述: vjudge POJ 题解: 二分答案+半平面交. 半径范围在0到5000之间二分,每次取$mid$然后平移所有直线,判断半平面交面积是否为零. 我的eps值取的是$10^{-12}$,3 ...
- POJ 3525 Most Distant Point from the Sea (半平面交+二分)
Most Distant Point from the Sea Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 3476 ...
- POJ 3525/UVA 1396 Most Distant Point from the Sea(二分+半平面交)
Description The main land of Japan called Honshu is an island surrounded by the sea. In such an isla ...
- POJ3525-Most Distant Point from the Sea(二分+半平面交)
Most Distant Point from the Sea Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 3955 ...
- 【POJ 3525】Most Distant Point from the Sea(直线平移、半平面交)
按逆时针顺序给出n个点,求它们组成的多边形的最大内切圆半径. 二分这个半径,将所有直线向多边形中心平移r距离,如果半平面交不存在那么r大了,否则r小了. 平移直线就是对于向量ab,因为是逆时针的,向中 ...
- 简单几何(半平面交+二分) LA 3890 Most Distant Point from the Sea
题目传送门 题意:凸多边形的小岛在海里,问岛上的点到海最远的距离. 分析:训练指南P279,二分答案,然后整个多边形往内部收缩,如果半平面交非空,那么这些点构成半平面,存在满足的点. /******* ...
随机推荐
- Python学习教程(learning Python)--1.2.4 Python格式化输出科学计数
Python在浮点数据输出时,可以采用科学计数法的方式输出. 现举两个例子说明一下如何使用. eg1. 无精度要求的科学计数法浮点数据输出 >>> print(format(1234 ...
- 刀哥多线程之并发队列gcd-05-dispatch_queue_concurrent
并发队列 特点 以先进先出的方式,并发调度队列中的任务执行 如果当前调度的任务是同步执行的,会等待任务执行完成后,再调度后续的任务 如果当前调度的任务是异步执行的,同时底层线程池有可用的线程资源,会再 ...
- 对云风 cstring 第二次解析
前言 从明天起 关心粮食和蔬菜 我有一所房子 面朝大海 春暖花开 本文前提条件 1.了解 posix 线程 2.了解 原子操作 3.具备简单C基础,或者 你也敲一遍. 如果上面不太清楚,你可以翻看我以 ...
- SQL基础篇——如何搭建一个数据库
特别提醒:所有的新建数据库,表,行,列都可以通过对象资源管理器操作,下面所讲的为查询操作方法 一.新建数据库 使用CREATE DATABASE语句建立数据库: 新建查询-- CREATE DATAB ...
- poj 2887 Big String
题目连接 http://poj.org/problem?id=2887 Big String Description You are given a string and supposed to do ...
- 数据密集型 和 cpu密集型 event loop
Node.js在官网上是这样定义的:“一个搭建在Chrome JavaScript运行时上的平台,用于构建高速.可伸缩的网络程序.Node.js采用的事件驱动.非阻塞I/O模型使它既轻量又高效,是构建 ...
- TFS(Taobao File System)安装方法
文章目录: 一.TFS(Taobao File System)安装方法 二.TFS(Taobao File System)配置dataServer.分区.挂载数据盘 三.TFS(Taobao File ...
- C++输出四则运算设计题的思路
一,(1)题目避免重复:使用srand(seed)函数进行随机化,随seed的不同,可以产生不同的随机数二,(1)控制数量:输入变量n控制三,(1)控制是否有乘除:(chengchu=0,没有乘除:c ...
- NABC需求分析
我们团队项目为7-magic,在这个七巧板项目中,我们团队的这个项目有许多的特点,我就其中的一个特点:用户可以自主的用七巧板设计自己想象出的图形,并与大家分享. N (Need 需求): 你的创意解决 ...
- 课堂练习:给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。
题目 1 给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数. 2 要求: (1) 写一个函数 f(N) ,返回1 到 N 之间出现的“1”的个数.例如 f(12) ...