POJ 2318

来源:互联网 发布:非法经营期货软件投诉 编辑:程序博客网 时间:2024/06/04 17:42

这是一道计算几何题,题意大概是:在一个大矩形里有n条分割线把矩形分割成n+1部分、再给出一些玩具的坐标、要求统计每个部分内有多少个玩具、思路:利用二分N个区域来,然后利用叉乘来判断是不是在其区域类!这里要利用叉乘的一个性质:(1)P*Q>0,P在Q的顺时针   (2)P*Q==0 ,P和Q共线   (3)P*Q<0, P在Q的逆时针代码如下:#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <algorithm>using namespace std;const int maxn=5010;int num[maxn];int n,m;struct node{    int x;    int y;} low[maxn],high[maxn];int pp(node aa,node bb,node cc)//这里就是利用叉乘来判断是不是在其区域{    return (cc.x-aa.x)*(bb.y-aa.y)-(cc.y-aa.y)*(bb.x-aa.x);}int slove(node cc)//这里利用二分来找{    int l=0;    int r=n, ans;    while(l<r)    {        int mid=(l+r)>>1;        if(pp(low[mid],high[mid],cc)>0)        {            l=mid+1;        }        else        {            r=mid;        }    }    return l;}int main(){    //int n,m;    node a,b;    while(scanf("%d",&n),n)    {        scanf("%d%d%d%d%d",&m,&a.x,&a.y,&b.x,&b.y);        for(int i=0; i<n; i++)        {            scanf("%d%d",&high[i].x,&low[i].x);            high[i].y=a.y;            low[i].y=b.y;        }        low[n].x=b.x;//这里有一个巧妙之处就是把n加入进去了        low[n].y=b.y;        high[n].x=b.x;        high[n].y=a.y;        node temp;        memset(num,0,sizeof(num));        for(int i=0; i<m; i++)        {            scanf("%d%d",&temp.x,&temp.y);            int q;            q=slove(temp);            num[q]++;        }        for(int i=0; i<=n; i++)        {            printf("%d: %d\n",i,num[i]);        }        printf("\n");    }    return 0;}在这个程序中利用上面的二分可以这样写,无论输出l还是r结果都对但是如果二分是这样写:int slove(node cc){    int l=0;    int r=n;    while(l<r)    {        int mid=(l+r)>>1;        if(pp(low[mid],high[mid],cc)>0)        {            l=mid+1;        }        else        {            r=mid-1;        }    }    return l;}好像只能return l,return r的话就会出错误!

原创粉丝点击