挺简单的一道计算几何 只需要知道叉积就可以做了
统计每块区间的toy数 然后toy数相同的统计为s.c 然后从小到大输出就OK了 我的查找方法数据量大的时候效率不高 最好换成二分查找 这样效率就会更高
最后注意 区间总共 n+1个 别漏了最后一个
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define Max 1005
using namespace std;
struct Result
{
int t,c;
}s[Max];
struct point
{
int x,y;
}toy[Max];
struct Line
{
struct point u,l;
int t;
}line[Max];
int Cross(point p1,point p2,point p0)
{
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
int Caculate(int T,int n)
{
for(int i = 0; i < n; i++)
{
int flag = Cross(line[i].l,line[i].u,toy[T]);
if(flag > 0) return i;
}
return n;
}
int cmp(struct Line a,struct Line b)
{
if(a.u.x < b.u.x)return 1;
else return 0;
}
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif // LOCAL
int n,m,x1,x2,y1,y2,u,l;
while((scanf("%d",&n),n))
{
scanf("%d%d%d%d%d",&m,&x1,&y1,&x2,&y2);
for(int i = 0; i < n; i++)
{
scanf("%d%d",&u,&l);
line[i].u.x = u;
line[i].u.y = y1;
line[i].l.x = l;
line[i].l.y = y2;
line[i].t = 0;
}
sort(line,line+n,cmp);//必须排序 否则后面的查找会出错
line[n].t = 0;
for(int i = 0;i < m; i++)
scanf("%d%d",&toy[i].x,&toy[i].y);
for(int i = 0; i < m; i++)
{
int f = Caculate(i,n);
line[f].t++;
}
for(int i = 0; i <= n; i++)
{
s[i].t = i;
s[i].c = 0;
}
for(int i = 0; i <= n; i++)
if(line[i].t) s[line[i].t].c++;
printf("Box\n");
for(int i = 0; i <= n; i++)
if(s[i].c)printf("%d: %d\n",s[i].t,s[i].c);
}
return 0;
}