void-man

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

给出一个矩形盒子,然后把他分成几部分,然后给出几个玩具的坐标,问最后每个部分里的玩具数量是多少输出...

可以用二分来判断玩具落在哪个部分里,然后用叉积来判断在线段的左边还是右边

#include <queue>
#include <stack>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <limits.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int MAX = 5010;
struct point{
    int x,y;
};
struct SEG{
    point u,l;
};
SEG s[MAX];
point toy[MAX];
int sum[MAX];
int crossProduct(point a,point b,point c)//向量 ac 在 ab 的方向
{
    return (c.x - a.x)*(b.y - a.y) - (b.x - a.x)*(c.y - a.y);
}

int main()
{
    int n,m,x1,y1,x2,y2,a,b;
    while( ~scanf("%d",&n) && n )
    {
        memset(sum,0,sizeof(sum));
        scanf("%d %d %d %d %d",&m,&x1,&y1,&x2,&y2);
        s[0].u.x = x1; s[0].u.y = y1;
        s[0].l.x = x1; s[0].l.y = y2;
        for(int i=1; i<=n; i++)
        {
            scanf("%d %d",&a,&b);
            s[i].u.x = a; s[i].u.y = y1;
            s[i].l.x = b; s[i].l.y = y2;
        }
        n++;
        s[n].u.x = x2; s[n].u.y = y1;
        s[n].l.x = x2; s[n].l.y = y2;
        for(int i=0; i<m; i++)
        {
            scanf("%d %d",&toy[i].x,&toy[i].y);
            int l=0,r=n,mid;
            while(1)
            {
               mid= (l+r)>>1;
               if(crossProduct(s[mid].u,toy[i],s[mid].l)>0)
               l=mid;
               else r=mid;
               if(l+1==r)break;

            }
            sum[l]++;
        }

        for(int i=0; i<n; i++)
            printf("%d: %d\n",i,sum[i]);
        printf("\n");
    }
return 0;
}
posted on 2011-09-08 12:59  void-man  阅读(152)  评论(0)    收藏  举报