zoukankan      html  css  js  c++  java
  • TOYS--POJ2318

    http://poj.org/problem?id=2318

    这是我写的第一道计算几何的题   然后竟然一A了  心情超级激动啊  !!!!

    我就只看了课件上说的叉积  然后就想到要这样写  我看学长的代码  太深奥  不行  还是自己写吧  然后就哇哈哈哈哈  

    题目大意:  给你一个长方形盒子   然后给你n个挡板把他分成n+1个小区域  有m个玩具  给你盒子的坐标  和每个挡板的坐标  还有每个玩具的坐标  

    然后让你求每个小区域内有几个玩具   是不是很简单

    分析:

    我想的是我把每个挡板用向量表示出来   然后给出每一个玩具的坐标看他是在挡板的那边    

    这到题用二分搜索   如果直接遍历会超时吧  应该   反正我看他们都用二分  我也用的二分就过了   

    二分的递归  好像第一次写这么好

    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #include <queue>
    #include <cstdio>
    #include <cstdlib>
    #include <cctype>
    #include <math.h>
    #include <ctype.h>
    
    using namespace std;
    #define memset(a,b) memset(a,b,sizeof(a))
    #define N 5500
    typedef long long  ll;
    
    struct node
    {
        int x, y, v;
    }p[N];
    int y2;
    
    int Find(int nx,int ny,int l,int r)
    {
        if(l==r-1)
            return l;
        int mid=(l+r)/2;
        node d;
        d.x=nx-p[mid].v;
        d.y=ny-y2;
        if((d.x*p[mid].y)-(d.y*p[mid].x)>0)///如果d点在右边
        {
            l=mid;
            r=r;
            return Find(nx,ny,l,r);
        }
        else if((d.x*p[mid].y)-(d.y*p[mid].x)<0)///如果d点在左边
        {
            l=l;
            r=mid;
            return Find(nx,ny,l,r);
        }
        return 0;
    }
    
    int main()
    {
        int n,m,x1,x2,y1,a[N];
        while(scanf("%d",&n),n)
        {
            memset(a,0);
            int u,v;
            scanf("%d %d %d %d %d",&m,&x1,&y1,&x2,&y2);
            p[0].x=x1;
            p[0].y=y2;
            p[0].v=x1;
            for(int i=1;i<=n;i++)
            {
                scanf("%d %d",&u,&v);
                p[i].x=u-v;
                p[i].y=y1-y2;
                p[i].v=v;
            }
            p[n+1].x=x2;
            p[n+1].y=y1;
            p[n+1].v=x2;
            for(int i=0;i<m;i++)
            {
                scanf("%d %d",&u,&v);
                int aa=Find(u,v,0,n+1);
                a[aa]++;
            }
            for(int i=0;i<=n;i++)
            {
                printf("%d: %d
    ",i,a[i]);
            }
            printf("
    ");
        }
        return 0;
    }
  • 相关阅读:
    POJ 1061
    LightOJ 1104
    扩展欧几里得算法
    2015 HUAS Summer Trainning #5 E
    2015 HUAS Summer Trainning #5 C
    2015 HUAS Summer Trainning #5 B
    2015 HUAS Summer Trainning #5 A
    2015 HUAS Summer Trainning #4 D
    2015 HUAS Summer Trainning #4 C
    2015 HUAS Summer Trainning #4 B
  • 原文地址:https://www.cnblogs.com/linliu/p/5405652.html
Copyright © 2011-2022 走看看