题意就是把一个矩形分成N+1个块,往里面扔M个玩具,问每个块里有多少玩具。
思路:求一下每条线的K和B。K不存在特殊标记一下,在K>0的情况下k*xx+b<yy表示在直线的左侧,同理在k<0的情况下k*xx+b>yy在直线的左侧。
#include"iostream"
#include"cmath"
#include"cstring"
#include"cstdlib"
using namespace std;
#define M 5555
int main()
{
int n,m;
double x1,x2,y1,y2;
while(scanf("%d",&n),n!=0)
{
scanf("%d",&m);
scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2);
int i,j;
double a[M],b[M];
double k[M],bb[M];
int c[M],f;
int ans[M];
memset(ans,0,sizeof(ans));
memset(c,0,sizeof(c));
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(k,0,sizeof(k));
memset(bb,0,sizeof(bb));
for(i=0;i<n;i++) scanf("%lf %lf",&a[i],&b[i]);
for(i=0;i<n;i++)
{
if(fabs(a[i]-b[i])>1e-8)
{
k[i]=(y1-y2)/(a[i]-b[i]);
bb[i]=y2-k[i]*b[i];
}
else
{
c[i]=-1;
bb[i]=a[i];
}
}
for(i=0;i<m;i++)
{
double xx,yy;
scanf("%lf%lf",&xx,&yy);
f=0;
for(j=0;j<n;j++)
{
if((c[j]==-1&&xx<bb[j])||(k[j]>0&&xx*k[j]+bb[j]<yy)||(k[j]<0&&xx*k[j]+bb[j]>yy))
{
ans[j]++;
f=1;
break;
}
}
if(f==0)
ans[(int)n]++;
}
for(i=0;i<=n;i++)
printf("%d: %d\n",i,ans[i]);
printf("\n");
}
return 0;
}