TOYS POJ - 2318 题解

本题利用了二分的思想,通过计算几何中通过向量(x2-x1)*(y2-y1)-(x3-x1)*(y3-y1)如果它小于零,则这个点在挡板的右边,大于零则在挡板左边。最后注意输出格式就好了,就是一道计算几何的基础题,小心点写应该问题不大

#include <iostream>
#include<stdio.h>
#include<string.h>

using namespace std;
int m,n;

struct node{
    int x2;
    int x1;
};
node a[5005];
int num[5005];
int xx1,yy1,xx2,yy2;
int solve(int x,int y){
    int lb=-1, ub=n+1;
    while(ub-lb>1){
        int mid=(lb+ub)/2;
        if((a[mid].x1-a[mid].x2)*(y-yy2)
           -(x-a[mid].x2)*(yy1-yy2)>0){
             ub=mid;
        }else{
            lb=mid;
        }
    }
    //cout<<lb<<endl;
    return lb;
}
int main()
{

    while(cin>>n&&n!=0){
        cin>>m;
        cin>>xx1>>yy1>>xx2>>yy2;
        a[0].x1=xx1;
        a[0].x2=xx1;
        for(int i=1;i<=n;i++){
            scanf("%d%d",&a[i].x1,&a[i].x2);
            //cin>>a[i].x1>>a[i].x2;
        }
        a[n+1].x1=xx2;
        a[n+1].x2=xx2;
        int x,y;
        memset(num,0,sizeof(num));
        for(int i=1;i<=m;i++){
            scanf("%d%d",&x,&y);
            //cin>>x>>y;
            int k=solve(x,y);
            num[k]++;
        }
        for(int i=0;i<=n;i++){
            cout<<i<<": "<<num[i]<<endl;
        }
        cout<<endl;
    }
    return 0;
}
 

猜你喜欢

转载自blog.csdn.net/qq_41641469/article/details/82717957