基因光线

基因光线

黑大帅统治古古怪界后,一直在玩一种很奇葩的游戏。在一个二维平面上,他先复制了n个小A,把他们放在不同的位置,然后射出一条ax+by+c=0的基因光线,宽度为d,即离这条直线的距离不大于d的小A会被射中。当然,某些悲剧的小A就会被射中,并变成黑小A。当然,这不是重点。玩了很久后,黑大帅猛然发现,自己竟然一次都没有射中小A。黑大帅怒了,于是他开启了作弊模式,将c改成自己想要的任意数值。现在,黑大帅想知道,在开启了作弊模式后,他射出一道基因光线最多能击中几个小A。

输入格式:

  第一行五个数字a,b,d,n,接下来n行每行两个数字x,y表示这个小A的坐标。

输出格式:

  一行一个数字表示最多能击中几个小A。

样例输入:

1 -1 0.707106782 5
0 0
1 0
0 1
2 0
2 1

样例输出:

4

数据范围:

50%的数据满足a=0;
100%的数据满足n<=100000,其余所有数值均为绝对值不大于1000的实数。

时间限制:

1s

空间限制:

64M

提示:

remove!!!
容易计算得在y轴上相差的距离为d*c,c见程序。我们先手动忽略常数,然后计算出该光线刚好击中一点时的
y值,然后扩展d的时候把每条光线都向上移d,就转化为对于每个2*d的区间求最多并集个数。即可
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using  namespace  std;
#define PER(i,a,b) for(int i=a;i<=b;i++)
#define REP(i,a,b) for(int i=a;i>=b;i--)
double  a,b,d;
int  n;
struct  NODE{
     double  x,y;
}l[1100001];
const  double  inf=0.000000003;
double  ll[1100001];
double  rr[1100001];
double  c;
void  prepare( int  x)
{
     ll[x]=l[x].x*a+l[x].y*b;
}  
int  pointl,pointr;
int  ans=0;
int  ond=0;
int  main()
{
     cin>>a>>b>>d>>n;
     PER(i,1,n)  scanf ( "%lf%lf" ,&l[i].x,&l[i].y);
     c= sqrt (a*a+b*b);
     d=d*c;
     PER(i,1,n) prepare(i);
     sort(ll+1,ll+n+1);
int  s=0; int  e=1;
while  (e<n)
{
     s++;
     while  (ll[e+1]-ll[s]<=d*2&&e<n) e++;
     ans=max(ans,e-s+1);
}
     cout<<ans<< "\n" ;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值