码迷,mamicode.com
首页 > 其他好文 > 详细

1106-Transmitters

时间:2015-02-10 17:05:01      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:1106-transmitters

题意大体是,给出圆心位置和半径,再给出n个其他点的坐标,判断半圆内最多有几个点,落在半圆边缘的点也计算在内,判断半圆不等式写错WA两次

思想是:

1、判断是否在圆内

2、从某一点(在圆内)开始,以这一点和圆心确定的直线为半圆的“底”,计算在此直线“之下”(y1*x-x1*y<=0)且在圆内的点有多少个

Transmitters 

Time Limit: 1000MS


Memory Limit: 10000K

Total Submissions: 4667


Accepted: 2496

Description

In a wireless networkwith multiple transmitters sending on the same frequencies频率, it is often arequirement that signals don‘t overlap重叠、重复, or at least that they don‘tconflict冲突.One way of accomplishing this is to restrict a transmitter‘s coverage area.This problem uses a shielded屏蔽了的,隔离了的 transmitter that only broadcasts in a semicircle. 

A transmitter T is located somewhere on a 1,000 square meter grid. Itbroadcasts in a semicircular area of radius r. The transmitter may be rotated
旋转 any amount, but notmoved. Given N points anywhere on the grid, compute the maximum number ofpoints that can be simultaneously reached by the transmitter‘s signal. Figure 1shows the same data points with two different transmitter rotations. 

技术分享


All input coordinates are integers (0-1000). The radius is a positive realnumber greater than 0. Points on the boundary of a semicircle are consideredwithin that semicircle. There are 1-150 unique points to examine pertransmitter. No points are at the same location as the transmitter. 

Input

Input consists ofinformation for one or more independent transmitter problems. Each problembegins with one line containing the (x,y) coordinates of the transmitterfollowed by the broadcast radius, r. The next line contains the number ofpoints N on the grid, followed by N sets of (x,y) coordinates, one set perline. The end of the input is signalled by a line with a negative radius; the(x,y) values will be present but indeterminate. Figures 1 and 2 represent thedata in the first two example data sets below, though they are on differentscales. Figures 1a and 2 show transmitter rotations that result in maximalcoverage.

Output

For each transmitter,the output contains a single line with the maximum number of points that can becontained in some semicircle.

SampleInput

25 25 3.5

7

25 28

23 27

27 27

24 23

26 23

24 29

26 29

350 200 2.0

5

350 202

350 199

350 198

348 200

352 200

995 995 10.0

4

1000 1000

999 998

990 992

1000 999

100 100 -2.5

SampleOutput

3

4

4

Source

Mid-Central USA 2001


代码:

# include <iostream>

# include <cstdlib>

# include <cmath>

using namespace std;

double x1,ya,x2,y2;

struct ele

{

    double x;

    double y;

    bool isCir;

};

void isCir(ele &a,double r)

{

    double d;

    d=a.x*a.x+a.y*a.y;

    if(d<=r*r)

    a.isCir=true;

    else a.isCir=false;

}


bool isSemicir(int x,int y)

{

    double k=(y2-ya)/(x2-x1);

    double b=ya-k*x1;

if(k*x-y+b<=0)

        return true;

        else return false;

}


int cmp(const void* a,const void*b)

{

    return (int)(*(ele*)a).x-(int)(*(ele*)b).x;

}


void dis(ele a,double r)

{

    double c,d;

    c=r/sqrt(1+a.y*a.y/(a.x*a.x));

    d=c*(-1);

    if(fabs(c-a.x)>=fabs(d-a.x))

    {

        x1=d;

        x2=c;

    }

    else

    {

        x1=c;

        x2=d;

    }

    ya=a.y/a.x*x1;

    y2=a.y/a.x*x2;

}

int main ()

{

    double x,y,a,b;

    int i,j,k,s,max,n;

    double r;

    cin>>x>>y>>r;

    while(r>=0)

    {

        cin>>n;

        ele* cor=new ele[n];

        for(i=0;i<n;i++)

        {

            cin>>a>>b;

            cor[i].x=a-x;

            cor[i].y=b-y;

            isCir(cor[i],r);

        }

        qsort(cor,n,sizeof(cor[0]),cmp);


        i=0;

        max=0;

        while(i<n)

        {

            if(cor[i].isCir==true)

            {

                if(cor[i].x==0)

                {

                    x1=x2=0;

                    if(cor[i].y>=0)

                    {

                        ya=r;

                        y2=-1*r;

                    }

                    else

                    {

                        y2=r;

                        ya=-1*r;

                    }

                }

                else

                {

                    dis(cor[i],r);

                }

                for(j=0,s=0;j<n;j++)

                {

                    if(cor[j].isCir==true&&isSemicir(cor[j].x,cor[j].y)==true)

                    s++;

                }

                if(s>max)

                max=s;

            }

            i++;

        }

        cout<<max<<endl;

        cin>>x>>y>>r;

    }

return 0;

}


1106-Transmitters

标签:1106-transmitters

原文地址:http://7938122.blog.51cto.com/7928122/1613316

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!