题目意思很简单,把一个盒子分成很多部分,往盒子里扔小球,小球的落点当然要告诉你拉,让你统计每个盒子里最后拥有的小球数。
我的做法是叉积+二分。
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
struct Point
{ // 二维点或矢量
double x, y;
Point() {}
Point(double x0, double y0): x(x0), y(y0) {}
};
struct Line
{ // 二维的直线或线段
Point p1, p2;
Line() {}
Line(Point p10, Point p20): p1(p10), p2(p20) {}
};
double multiply(Point sp,Point ep,Point op)
{
return((sp.x-op.x)*(ep.y-op.y) - (ep.x-op.x)*(sp.y-op.y));
}
Line myline[5100];
int record[5100];
int main()
{
int n,m,i;
Point left;
Point right;
while(scanf("%d",&n))
{
if(n==0)
break;
memset(record,0,sizeof(record));
scanf("%d%lf%lf%lf%lf",&m,&left.x,&left.y,&right.x,&right.y);
myline[0].p1.x=left.x;
myline[0].p1.y=right.y;
myline[0].p2.x=left.x;
myline[0].p2.y=left.y;
for(i=1;i<=n;i++)
{
scanf("%lf%lf",&myline[i].p2.x,&myline[i].p1.x);
myline[i].p1.y=right.y;
myline[i].p2.y=left.y;
}
myline[n+1].p1.x=right.x;
myline[n+1].p1.y=right.y;
myline[n+1].p2.x=right.x;
myline[n+1].p2.y=left.y;
Point toy;
for(i=1;i<=m;i++)
{
scanf("%lf%lf",&toy.x,&toy.y);
int front=0;
int rear=n+1;
while(front<=rear)
{
int mid=(front+rear)>>1;
if(multiply(toy,myline[front].p2,myline[front].p1)>0&&multiply(toy,myline[mid].p2,myline[mid].p1)<0)
{
if(mid==front+1)
{
record[front]++;
break;
}
rear=mid;
continue;
}
else
{
if(mid+1==rear)
{
record[mid]++;
break;
}
front=mid;
continue;
}
}
}
for(i=0;i<=n;i++)
{
printf("%d: %d\n",i,record[i]);
}
printf("\n");
}
return 0;
}
恭喜此题成为我收集计算几何模板的第一题 呵呵~