加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

POJ 2318 TOYS 计算几何 叉积

(2010-07-19 12:52:21)
标签:

poj

pku

2318

it

分类: 计算几何

题目描述:

给你一个矩形盒子的坐标,在给你n个盒子中挡板的坐标(n个挡板把盒子分成了n+1块)。在给你m个玩具,放在坐标x,y,问每个玩具具体放在那个块,最后输出每个块有多少个玩具。

解题报告:

对于每一个玩具坐标x,y,二分查找每一个挡板,运用叉积,如果在前一个挡板的右侧,当前挡板的左侧,那么就在这一块了。

否则,如果在前一个挡板的当前挡板的左侧,那么r = mid - 1;

如果在当前挡板的右侧,l = mid + 1

代码如下:

#include<iostream>
using namespace std;
int n, m, x1, y1, x2, y2, x[5002][2], a, b, ans[5002];
int jeogia(int id)//求叉积
{
    return (x[id][0] - x[id][1]) * (b - y2) - (a - x[id][1]) * (y1 - y2);
}
void judge()//二分查找位置
{
    int l = 1, r = n + 1, mid;
    while(l <= r)
    {
        mid = (l + r) / 2;
        int temp1 = jeogia(mid - 1);
        int temp2 = jeogia(mid);
        if (temp2 > 0)
        {
            if (temp1 < 0)
            {
                ans[mid - 1]++;
                break;
            }
            else r = mid - 1;
        }
        else
            l = mid + 1;
    }
}
int main()
{
    bool flag = false;
    while(scanf("%d", &n) && n)
    {
        if (flag) printf("\n");
        else flag = true;
        scanf("%d%d%d%d%d", &m, &x1, &y1, &x2, &y2);
        x[0][0] = x[0][1] = x1;
        x[n + 1][0] = x[n + 1][1] = x2;
        for(int i = 1; i <= n; i++)
            scanf("%d%d", &x[i][0], &x[i][1]);
        memset(ans, 0, sizeof(ans));
        for(int i = 0; i < m; i++)
        {
            scanf("%d%d", &a, &b);
            judge();
        }
        for(int i = 0; i <= n; i++)
            printf("%d: %d\n", i, ans[i]);
    }
    return 0;
}

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有