HDU3264 Open-air shopping malls

来源:互联网 发布:c语言基本 编辑:程序博客网 时间:2024/05/21 02:53

http://acm.hdu.edu.cn/showproblem.php?pid=3264


09宁波

计算几何。计算半个圆面积是需要推一下。


#include <cstdio>#include <cstring>#include <cmath>#include <map>#include <set>#include <vector>#include <iostream>#include <cstdlib>#include <algorithm>#include <string>#include <queue>#include <time.h>#include <list>#include <stack>using namespace std;const double eps=1e-6;const long long INF=(1<<30)-1;const double pi=3.1415926535897932384626433;#define N 25#define M 1000000000struct circ{    double x,y,r;}c[N];int n;double dist(struct circ p,struct circ q){    return sqrt((p.x-q.x)*(p.x-q.x)+(p.y-q.y)*(p.y-q.y));}double arccos(double s){    if (fabs(s-1)<eps) return 0;    else return acos(s);}double disR(int p,int q){    double s=dist(c[p],c[q]);    double t=s+c[q].r;    double r=c[q].r;    double sc=pi*r*r;    sc/=2.0;    double R,d=s,ss;    while (fabs(t-s)>eps)    {        R=(s+t)/2.0;        double thi=arccos( (d*d+r*r-R*R)/(2*d*r) );        double thi2=arccos( (d*d+R*R-r*r)/(2*d*R) );        ss=r*r*thi+R*R*thi2-d*r*sin(thi);        //cout<<R<<"*************"<<r<<endl;        //cout<<thi<<' '<<thi2<<' '<<ss<<endl;        if (ss>sc) t=R;        else s=R;    }    return R;}int main(){    //freopen("a","r",stdin);    int T,kk,i,j,x,y,r1,k;    scanf("%d",&T);    for (kk=1;kk<=T;kk++)    {        scanf("%d",&n);        for (i=1;i<=n;i++)        {            scanf("%d%d%d",&x,&y,&r1);            c[i].x=x;            c[i].y=y;            c[i].r=r1;        }        if (n==1)        {            printf("%.4f\n",c[1].r/sqrt(2));            continue;        }        double min=100000,d,r;        for (i=1;i<=n;i++)        {            double max=-1;            for (j=1;j<=n;j++)            if (j!=i)            {                double ans=disR(i,j);                if (ans>max) max=ans;            }            if (max<min) min=max;        }        printf("%.4f\n",min);    }    return 0;}


原创粉丝点击