UVA 1396_UVC和UVA

UVA 1396_UVC和UVA书上的题目,开始跟着新的大神了==#include#include#include#includeusingnamespacestd;//精度控制constdoubleeps=1e-10;intdcmp(doublex){if(fabs(x)

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
书上的题目,开始跟着新的大神了= =

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;

//精度控制
const double eps=1e-10;
int dcmp(double x)
{
    if(fabs(x)<eps) return 0;
    return x<0?-1:1;
}

//点
struct Point
{
    double x,y;
    Point(){}
    Point(double x,double y):x(x),y(y){}
};

//向量
typedef Point Vector;

//点-点==向量
Vector operator-(Point A,Point B)
{
    return Vector(A.x-B.x,A.y-B.y);
}

//向量+向量==向量 或 点+向量==点
Vector operator+(Vector A,Vector B)
{
    return Vector(A.x+B.x,A.y+B.y);
}

//向量*实数==向量
Vector operator*(Vector A,double p)
{
    return Vector(A.x*p,A.y*p);
}

//求向量长度
double Length(Vector v)
{
    return sqrt(v.x*v.x+v.y*v.y);
}

//返回v逆时针旋转90度的单位向量
Vector Normal(Vector v)
{
    double L=Length(v);
    return Vector(-v.y/L, v.x/L);
}

//叉积
double Cross(Vector A,Vector B)
{
    return A.x*B.y-A.y*B.x;
}

//直线
struct Line
{
    Point p;
    Vector v;
    double ang;
    Line(){}
    Line(Point p,Vector v):p(p),v(v)
    {
        ang=atan2(v.y,v.x);
    }
    bool operator<(const Line &L)const
    {
        return ang<L.ang;
    }
};

//判断p是否在直线L左边(在直线上不算)
bool OnLeft(Line L,Point p)
{
    return Cross(L.v,p-L.p)>0;
}

//得到直线的交点
Point GetIntersection(Line a,Line b)
{
    Vector u=a.p-b.p;
    double t=Cross(b.v,u)/Cross(a.v,b.v);
    return a.p+a.v*t;
}

//求直线集合L构成的半平面交集,如果存在是一个凸包
int HalfplaneIntersection(Line *L,int n,Point *poly)
{
    //极角排序
    sort(L,L+n);

    int first=0,last=0;
    Point *p=new Point[n];
    Line *q=new Line[n];
    q[0]=L[0];

    for(int i=1;i<n;i++)
    {
        //删除尾部无效节点
        while(first<last && !OnLeft(L[i],p[last-1])) last--;
        //删除头部无效节点
        while(first<last && !OnLeft(L[i],p[first])) first++;
        //插入新直线
        q[++last]=L[i];

        //如果新插入的直线与last直线平行,需要删除最右边的那条
        if(fabs(Cross(q[last].v,q[last-1].v))<eps)
        {
            last--;
            if(OnLeft(q[last],L[i].p)) q[last]=L[i];
        }

        //新插入直线与上一条直线构成last-1交点
        if(first<last) p[last-1]=GetIntersection(q[last-1],q[last]);
    }

    //同first直线排序尾部无效节点
    while(first<last && !OnLeft(q[first],p[last-1])) last--;

    //半平面不构成有界区域
    if(last-first<=1 ) return 0;

    //求首直线与尾直线交点
    p[last]=GetIntersection(q[last],q[first]);

    int m=0;
    for(int i=first;i<=last;i++) poly[m++]=p[i];
    return m;
}

const int N=101;
int n;
Point p[N],poly[N];
Vector v1[N],v2[N];
Line l[N];

int main()
{
    while(scanf("%d",&n)&&n){
        for(int i=0;i<n;i++){
            scanf("%lf%lf",&p[i].x,&p[i].y);
        }
        for(int i=0;i<n;i++){
            v1[i]=p[(i+1)%n]-p[i];
            v2[i]=Normal(v1[i]);
        }
        double left=0,right=1e8;
        while((right-left)>1e-7){
            double mid=(right+left)/2;
            for(int i=0;i<n;i++){
                l[i]=Line(p[i]+v2[i]*mid,v1[i]);
            }
            int m=HalfplaneIntersection(l,n,poly);
            if(!m)right=mid;
            else left=mid;
        }
        printf("%.6lf\n",left);
    }
    return 0;
}


















版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/169945.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • acwing-378. 骑士放置(最小独立集)

    acwing-378. 骑士放置(最小独立集)给定一个 N×M 的棋盘,有一些格子禁止放棋子。问棋盘上最多能放多少个不能互相攻击的骑士(国际象棋的“骑士”,类似于中国象棋的“马”,按照“日”字攻击,但没有中国象棋“别马腿”的规则)。输入格式第一行包含三个整数 N,M,T,其中 T 表示禁止放置的格子的数量。接下来 T 行每行包含两个整数 x 和 y,表示位于第 x 行第 y 列的格子禁止放置,行列数从 1 开始。输出格式输出一个整数表示结果。数据范围1≤N,M≤100输入样例:2 3 0输出样例:4#include<b

    2022年8月10日
    4
  • 网络安全2020年前景展望:九大未来的安全威胁

    网络安全2020年前景展望:九大未来的安全威胁

    2022年4月2日
    54
  • pycharm调整字体大小快捷键_调整字体大小在哪里

    pycharm调整字体大小快捷键_调整字体大小在哪里这个方法是最好的:https://blog.csdn.net/awyyauqpmy/article/details/79334496?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

    2022年8月25日
    8
  • matlab怎么fprintf,matlab中的fprintf函数怎么用「建议收藏」

    matlab怎么fprintf,matlab中的fprintf函数怎么用「建议收藏」matlab中的fprintf函数怎么用发布时间:2020-06-2217:10:46来源:亿速云阅读:97作者:Leahmatlab中的fprintf函数怎么用?针对这个问题,今天小编总结了这篇文章,希望能帮助更多想解决这个问题的朋友找到更加简单易行的办法。fprintf函数可以将数据按指定格式写入到文本文件中。其调用格式为:数据的格式化输出:fprintf(fid,format,vari…

    2022年8月31日
    4
  • C++ Qt常用面试题整理(不定时更新)[通俗易懂]

    C++ Qt常用面试题整理(不定时更新)[通俗易懂]1.Qt多线程同步的几种实现方式(1)互斥量:QMutexQMutex类提供的是线程之间的访问顺序化。QMutex的目的是保护一个对象/数据结构或者代码段在同一时间只有一个线程可以访问。基本使用方法如下:QMutexmutex;intvar;voidfunction(){mutex.lock();//访问varvar*var;mutex.unlock();}如果使用mutex加锁,却没有使用unlock解锁,那么就会造成..

    2022年6月25日
    43
  • SQL语句面试题目_sql基础知识面试题

    SQL语句面试题目_sql基础知识面试题我自己编辑总结的sql面试题目大全,也是每条都验证过的第一类:sql面试题(学生表_课程表_成绩表_教师表)表结构,节选自:http://www.cnblogs.com/qixuejia/p/3637735.html题目一,节选,自:https://wenku.baidu.com/view/cda288f1b90d6c85ed3ac671.html题目二,节选,自:http://ww…

    2022年8月29日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号