HDU 4562 守护雅典娜

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4562

题意:给出一个点p(X,Y)以及若干圆。从中选出尽可能多的圆满足:圆能且只能包含p或者原点中的一个(不能在圆上);圆之间不能相交或者相切。

思路:首先分理出只包含原点或者p的圆,然 后分别按照半径升序排序。分别对包含原点和p的进行dp。f1[i]表示包含原点的圆中前i个最多选出多少个。f2[i]表示p的。然后合并。就是枚举 f1的i和f2的j,若这两个圆不冲突,那么就能选出f1[i]+f2[j]个。

 

const int N=1005;


class point
{
    public:
    int x,y;


    point(){}
    point(int _x,int _y)
    {
        x=_x;
        y=_y;
    }
    void get()
    {
        RD(x,y);
    }


    point operator-(point a)
    {
        return point(x-a.x,y-a.y);
    }


    int len()
    {
        return x*x+y*y;
    }
};




class Circle
{
    public:
    point p;
    int R;


    void get()
    {
        p.get();
        RD(R);
    }


    int on(point a)
    {
        return R*R==(a-p).len();
    }


    int in(point a)
    {
        return R*R>(a-p).len();
    }


    int ok(Circle a)
    {
        int x=abs(a.R-R),y=a.R+R,L=(a.p-p).len();
        return Ly*y;
    }
};




point a,b;
vector p,q;
int n,f1[N],f2[N];


int cmp(Circle a,Circle b)
{
    return a.R

 

 

 

你可能感兴趣的:(php)