ZOJ1041 Transmitters

 #include<iostream>

#include<cmath>
using namespace std;

struct point{
int x;
int y;
};

struct myvector{
int a;
int b;
};

int semix,semiy;
int num,initm;
double radius;
point points[160];
myvector v[160];

int cal(int m,int n)
{
return m*m+n*n;
}

void foredeal()
{
int n=0;
int i;
for(i=0;i<num;i++){
int temp=cal(v[i].a,v[i].b);
if(temp<=radius*radius){
v[n].a=v[i].a;
v[n].b=v[i].b;
n++;
}
}
num=n;
}

void initmax()
{
//这里处在边界的要另外算,不能一开始的时候就与某个部分合并,否则答案会出错
double k;
int n1=0;
int n2=0;
int n=1;

if(v[0].a!=0){
k=((double)v[0].b)/v[0].a;
for(int i=1;i<num;i++){
if(k*v[i].a-v[i].b<0)
n1++;
else if(k*v[i].a-v[i].b>0)
n2++;
else
n++;
}
}
else{
for(int i=1;i<num;i++){
if(v[i].a<0)
n1++;
else if(v[i].a>0)
n2++;
else
n++;
}
}

initm=(n1+n)>(n2+n)? (n1+n):(n2+n);
}

void findmax(int j)
{
double k;
int n1=0;
int n2=0;
int n=1;

if(v[j].a!=0){
k=((double)v[j].b)/v[j].a;
for(int i=0;i<num;i++){
if(i!=j){
if(k*v[i].a-v[i].b<0)
n1++;
else if(k*v[i].a-v[i].b>0)
n2++;
   else
n++;
}
}
}
else{
for(int i=0;i<num;i++){
if(i!=j){
if(v[i].a<0)
n1++;
else if(v[i].a>0)
n2++;
else
n++;
}
}
}

int temp=(n1+n)>(n2+n)? (n1+n):(n2+n);
if(temp>initm)
initm=temp;
}

int main()
{
int i;

while(cin>>semix>>semiy>>radius && semix>=0 && radius>=0 && semiy>=0){
cin>>num;

for(i=0;i<num;i++){
cin>>points[i].x>>points[i].y;
}

for(i=0;i<num;i++){
v[i].a=points[i].x-semix;
v[i].b=points[i].y-semiy;
}

foredeal();

if(num!=0){
initmax();
for(i=1;i<num;i++){
findmax(i);
}
cout<<initm<<endl;
}
else{
cout<<0<<endl;
}
}
return 0;
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值