​TOYS POJ - 2318​​​
题意:给出n,m,x1,y1,x2,y2;n代表又n个隔板,m代表将放入m个玩具,x1,y1代表左上的点,x2,y2代表右上的点。
思路:初学向量这方面,根据题解的意思,自己写的。主要利用的原理是向量叉乘:向量P与向量Q。
P*Q>0 P在向量Q的顺时针方向(右)
P*Q<0 P在向量Q的逆时针方向 (左)
P*Q=0 P与Q共线,可能同向,可能反向。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
struct point
{
int x,y;
point(){}
point(int _x,int _y){x=_x;y=_y;}
};
struct v{
point start;
point end;
v(){}
v(point _start,point _end){
start=_start;end=_end;
}
}ve[5010];
int cross(v v1,v v2)
{
int result=0;
v1.end.x=v1.end.x-v1.start.x;
v1.end.y=v1.end.y-v1.start.y;
v1.start.x=v1.start.y=0;
v2.end.x=v2.end.x-v2.start.x;
v2.end.y=v2.end.y-v2.start.y;
v2.start.x=v2.start.y=0;
result=v1.end.x*v2.end.y-v2.end.x*v1.end.y;
return result;
}
//向量的叉积的一个重要性质可以通过他的符号判断两向量之间的顺逆时针关系
int n,m,x1,y1,x2,y2,ans[5010];
int ui,li;
int main()
{
while(scanf("%d",&n)!=EOF&&n)
{
scanf("%d%d%d%d%d",&m,&x1,&y1,&x2,&y2);
memset(ans,0,sizeof(ans));
for(int i=0;i<n;i++)
{
scanf("%d%d",&ui,&li);//变为向量
ve[i]=v(point(ui,y1),point(li,y2));
}
for(int i=0;i<m;i++)
{
point p;
scanf("%d%d",&p.x,&p.y);
int l=0,r=n,t=n;
while(l<=r)//
{
int mid=(l+r)/2;
if(cross(v(p,ve[mid].start),ve[mid])<=0)//在左边
{
t=mid;
r=mid-1;
}
else l=mid+1;
}
ans[t]++;
}
for(int i=0;i<n+1;i++)
{
printf("%d: %d\n",i,ans[i]);
}
printf("\n");
}
return 0;