zoukankan      html  css  js  c++  java
  • CodeForces 614C Peter and Snow Blower

    简单计算几何,只要算出圆心到多边形上的最短距离和最长距离即可

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    
    const int maxn=100000+10;
    struct Point
    {
        double x,y;
    } p[maxn];
    double a,b;
    int n;
    
    double GetPointDistance(Point p1, Point p2)
    {
        return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
    }
    
    double GetNearestDistance(Point PA, Point PB, Point P3)
    {
        double a,b,c;
        a=GetPointDistance(PB,P3);
        if(a<=0.00001) return 0.0f;
        b=GetPointDistance(PA,P3);
        if(b<=0.00001) return 0.0f;
        c=GetPointDistance(PA,PB);
        if(c<=0.00001) return a;
        if(a*a>=b*b+c*c) return b;
        if(b*b>=a*a+c*c) return a;
        double l=(a+b+c)/2;
        double s=sqrt(l*(l-a)*(l-b)*(l-c));
        return 2*s/c;
    }
    
    int main()
    {
        double Max=-1;
        double Min=-1;
        scanf("%d%lf%lf",&n,&a,&b);
        Point T;
        T.x=a;
        T.y=b;
        for(int i=0; i<n; i++) scanf("%lf%lf",&p[i].x,&p[i].y);
        for(int i=0; i<n; i++)
        {
            double MinLen=GetNearestDistance(p[(i+1)%n],p[i],T);
            if(Min==-1) Min=MinLen;
            else Min=min(Min,MinLen);
    
            double Len1=sqrt((p[i].x-a)*(p[i].x-a)+(p[i].y-b)*(p[i].y-b));
            double Len2=sqrt((p[(i+1)%n].x-a)*(p[(i+1)%n].x-a)+(p[(i+1)%n].y-b)*(p[(i+1)%n].y-b));
            double MaxLen=max(Len1,Len2);
            if(Max==-1) Max=MaxLen;
            else Max=max(Max,MaxLen);
        }
    
        printf("%lf
    ",3.1415926*(Max*Max-Min*Min));
        return 0;
    }
  • 相关阅读:
    【C++日常】C++动态命名变量名
    两个整数相除
    Jsp页面跳转 接收时的乱码问题
    Reverse a singly linked list
    Java处理excel文件
    Navicat for mysql 破解
    EasyUi 分页 和 表格数据加载
    Spring 框架下Controller 返回结果在EasyUI显示
    svn ubuntu command(转载)
    Shiro Security
  • 原文地址:https://www.cnblogs.com/zufezzt/p/5141842.html
Copyright © 2011-2022 走看看