题目大意:有一个盒子,n块挡板把盒子分成n+1部分,有m个玩具给出坐标,判断盒子中每个部分各有多少个玩具。
我的思路:直接枚举每个玩具在各个区域的情况,利用叉积判断,若叉积大于0则在该侧。(也可以用二分优化)
#include<stdio.h> #include<stdlib.h> #include<math.h> #define eps 1e-10 int dcmp(double x) { if(fabs(x)<eps)//x==0 return 0; else return x<0?-1:1; } struct point { int x,y; }; struct point dot[5000+10];//每个挡板的向量 struct point play[5000+10];//玩具的向量 double cross(double x1,double y1,double x2,double y2)//叉积 { return x1*y2-x2*y1; } int main() { int n,m,i,j,k; int a[5000+10],b[5000+10];//挡板坐标 int x1,y1,x2,y2;//盒子坐标 int xx,yy;//玩具坐标 while(scanf("%d%d",&n,&m)&&n!=0)//n个挡板,m个玩具 { double temp; int ans[5000+10]={0};//最后结果 scanf("%d%d%d%d",&x1,&y1,&x2,&y2);//盒子坐标 for(i=1;i<=n;i++) { scanf("%d%d",&a[i],&b[i]); dot[i].x=a[i]-b[i],dot[i].y=y1-y2;//挡板向量 } int sum=0; for(i=1;i<=m;i++) { scanf("%d%d",&xx,&yy);//每个玩具的坐标 for(j=1;j<=n;j++)//第几个挡板 { play[i].x=xx-b[j],play[i].y=yy-y2;//玩具向量 temp=cross(play[i].x,play[i].y,dot[j].x,dot[j].y); if(dcmp(temp)==-1) { ans[j-1]++; sum++; break; } } } ans[n]=m-sum; for(i=0;i<=n;i++) printf("%d: %d\n",i,ans[i]); printf("\n");//注意格式 } return 0; }