codeforces 613A Peter and Snow Blower

来源:互联网 发布:mac电脑查看ip地址 编辑:程序博客网 时间:2024/04/26 11:13

数学题,核心是求给定圆心到多边形的最短和最长距离,选用哪种公式非常重要.。。wa了半天发现Point定义里面居然写成了int T_T

最大距离一定是到某一个顶点

最小则不一定,与圆心,线段两定点构成的三角形形状有关。

我用到了三边求面积公式——海伦公式:s=sqrt(p*(p-a)*(p-b)*(p-c)); 其中p=(a+b+c)/2;

贴代码:

#include<iostream>#include<cstdio>#include<cmath>#define INF 10000000using namespace std;const int MAX_N=1e6+10;const double PI=acos(-1.0);struct Point{    double a,b;}p[MAX_N];double getl(Point X,Point Y){    double d1=(X.a-Y.a)*(X.a-Y.a);    double d2=(X.b-Y.b)*(X.b-Y.b);    return sqrt(d1+d2);}double getlength(Point A,Point B,Point C,double &temp)/// C to A-B{    double a=getl(A,C);    double b=getl(B,C);    double c=getl(A,B);    temp=max(a,b);        if(a*a>=b*b+c*c)/// B or A >=90        return b;    if(b*b>=a*a+c*c)        return a;    double pp=(a+b+c)/2;    double s=(pp-a)*(pp-b)*(pp-c)*pp;    s=sqrt(s);    double d=s*2/c;    return d;}int main(){    int n;    scanf("%d",&n);    Point T;    scanf("%lf%lf",&T.a,&T.b);    for(int i=0;i<n;i++)    scanf("%lf%lf",&p[i].a,&p[i].b);    double maxx=-(double)INF;    double minn=(double)INF;    double temp;    for(int i=0;i<n;i++)    {        minn=min(minn,getlength(p[i],p[(i+1)%n],T,temp));        maxx=max(maxx,temp);    }    double ans=maxx*maxx-minn*minn;    ans*=PI;    printf("%.10lf\n",ans);    return 0;}


0 0
原创粉丝点击