TOYS POJ - 2318

本文介绍了解决TOYSPOJ-2318问题的方法,该问题涉及通过向量叉乘判断玩具相对于隔板的位置。文章详细解释了如何使用向量叉乘来确定玩具位于隔板的哪一侧,并提供了一个C++实现示例。

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值