hdu 3265 Posters

///给你若干个没有交集的圆,以其中一个圆的圆心为圆心做一个圆
///使得这个圆至少包含所有圆面积的一半,求这个圆最小的半径
# include <stdio.h>
# include <algorithm>
# include <iostream>
# include <string.h>
# include <math.h>
#include <string>
using namespace std;
struct node
{
    double x;
    double y;
    double r;
};
int t1,t2;
double rr;
const double d = 1e-10;
const double pi = acos(-1.0);
struct node a[25];
double ss;
double cal(int x1,int y1)///两圆圆心距离
{
    return sqrt((a[x1].x-a[y1].x)*(a[x1].x-a[y1].x)*1.0+(a[x1].y-a[y1].y)*(a[x1].y-a[y1].y)*1.0);
}
double area(double mid)///求两圆交叉面积
{
    double a = cal(t1, t2), b = rr, c = mid;
    double cta1 = acos((a * a + b * b - c * c) / 2 / (a * b)),
           cta2 = acos((a * a + c * c - b * b) / 2 / (a * c));
    double s1 = rr*rr*cta1 - rr*rr*sin(cta1)*(a * a + b * b - c * c) / 2 / (a * b);
    double s2 = mid*mid*cta2 - mid*mid*sin(cta2)*(a * a + c * c - b * b) / 2 / (a * c);
    return s1 + s2;
}
double f(double m)
{
    if(area(m)-ss>=1e-20)
        return 1;
    else
        return 0;
}
int main()
{
    int t,n,i,j;
    double min1,max1,min2,max2,jj;
    while(~scanf("%d",&t))
    {
        while(t--)
        {
            scanf("%d",&n);
            for(i=0; i<n; i++)
                scanf("%lf%lf%lf",&a[i].x,&a[i].y,&a[i].r);
            if(n==1)
            {
                min1=sqrt(a[0].r*a[0].r*0.5);
                printf("%.4lf\n",min1);
            }
            else
            {
                double lll=1000000000;

                for(i=0; i<n; i++)
                {
                    max1=-1;
                    double ll=-1;
                    for(j=0; j<n; j++)
                    {
                        if(i!=j)
                        {
                            t2=i;
                            t1=j;
                            rr=a[t1].r;
                            max1=cal(i,j);
                            min2=max1+rr;
                            ss=pi*rr*rr*0.5;
                            double l=max1;
                            double r=min2;
                            while(r-l>d)///二分面积
                            {
                                double  mid=(l+r)/2;
                                if(f(mid)==1)
                                    r=mid;
                                else
                                    l=mid;
                            }
                            ll=max(ll,l);
                        }

                    }
                    lll=min(lll,ll);
                }
                printf("%.4lf\n",lll);

            }
        }
    }
    return 0;
}

时间: 2024-10-14 17:35:46

hdu 3265 Posters的相关文章

HDU 3265 Posters(线段树)

HDU 3265 Posters 题目链接 题意:给定一些矩形海报,中间有孔,求贴海报的之后的海报覆盖面积并 思路:海报一张可以切割成4个矩形,然后就是普通的矩形面积并了,利用线段树维护即可 代码: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; const int N = 50005; struct Node { i

hdu 3265 Posters(扫描线)

题目链接:hdu 3265 Posters 题目大意:就是给定N个矩形,矩形比较特殊,均被减掉了一部分,问说图形最后的覆盖面积. 解题思路:一开始做的时候以为直接做扫描线就好了,一个做加的一个做减的,后来写完样例都跑不出来,还是对扫描线理解的不够深刻,因为扫描线没有pushdown的操作,因为它肯定对于每段区间有加有减,那么如果碰到一开始就是减的,就没法做了. 正解是将一个图形差分成至多4个小的矩形表示,然后直接扫描线. #include <cstdio> #include <cstri

HDU 3265 Posters (线段树+扫描线)(面积并)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3265 给你n个中间被挖空了一个矩形的中空矩形,让你求他们的面积并. 其实一个中空矩形可以分成4个小的矩形,然后就是面积并,特别注意的是x1 == x3 || x2 == x4的时候,要特判一下,否则会RE. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <algori

(中等) HDU 3265 Posters , 扫描线。

Problem Description Ted has a new house with a huge window. In this big summer, Ted decides to decorate the window with some posters to prevent the glare outside. All things that Ted can find are rectangle posters. However, Ted is such a picky guy th

HDU 3265 Posters(线段树扫描线&#183;矩形框面积并)

题意  把一些矩形海报挖去一部分小矩形贴在指定位置  问最后海报覆盖的面积 一个矩形框可以分割成4个独立的小矩形  然后就能用扫描线求面积并了 #include <cstdio> #include <algorithm> using namespace std; const int N = 100005, M = N << 2; typedef long long ll; struct SLine { int x, y1, y2, flag; SLine() {}; S

HDU 3265 Posters ——(线段树+扫描线)

第一次做扫描线,然后使我对线段树的理解发生了动摇= =..这个pushup写的有点神奇.代码如下: 1 #include <stdio.h> 2 #include <algorithm> 3 #include <string.h> 4 #define t_mid (l+r>>1) 5 #define ls (o<<1) 6 #define rs (o<<1|1) 7 #define lson ls,l,t_mid 8 #define

HDU 3265 扫描线(矩形面积并变形)

Posters Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5230    Accepted Submission(s): 1220 Problem Description Ted has a new house with a huge window. In this big summer, Ted decides to decora

hdu 3265 矩形剪块面积并

http://acm.hust.edu.cn/vjudge/problem/10769 给n张海报,在每张海报上剪掉一个矩形,求面积并 把剪块的海报分成四个矩形,就是普通的求面积并问题了 #include <iostream> #include <string> #include <cstring> #include <cstdlib> #include <cstdio> #include <cmath> #include <a

【hdu】Mayor&#39;s posters(线段树区间问题)

需要离散化处理,线段树的区间修改问题. 需要注意的就是离散化的时候,由于给的数字是一段单位长度,所以需要特殊处理(因为线段的覆盖和点的覆盖是不一样的) 比如:(1,10)(1,4) (6,10) 离散化之后是 1 , 4 , 6 , 10 分别离散为 1 2 3 4 覆盖的时候先覆盖1 4 之后覆盖了1 2 之后覆盖了 2 3,结果为2 但是实际上应该是3 13450359 201301052100 2528 Accepted 1140K 985MS C++ 1960B 2014-09-17 1