poj 2398 Toy Storage(计算几何,点跟直线的位置关系)

来源:互联网 发布:数据分析下载- 编辑:程序博客网 时间:2024/05/18 01:14

原题友情链接直通车~鼠标点击此处打开~poj 2398

这个题是poj 2318 的变形  点此打开链接poj 2318 题解报告

主要就是告诉你的划分的线段的顺序不是有序的了。然后再输出要求上要求输出的是有m个玩具的箱子的个数。

主要思路不变,只要把line数组里的直线排个序,跟2318一样的做法AC。

具体实现看代码。

#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>using namespace std;const int Maxsize = 5010;typedef struct{int x,y;}point;typedef struct{point a,b;}Line;Line line[Maxsize];int cnt[Maxsize];bool cmp(Line A,Line B){if(A.a.x != B.a.x ){return A.a.x < B.a.x;}else{return A.b.x < B.b.x;}}int crossProduct(point p1,point p2,point p0)/*叉乘判断点跟直线的位置关系*/{return (p1.x - p0.x)*(p2.y - p0.y) - (p2.x - p0.x)*(p1.y - p0.y);}void found(point p0,int n)/*二分找区域*/{int r,l,mid;l = 0 , r = n -1;while(l < r){mid = (r + l )>>1;if(crossProduct(p0,line[mid].a,line[mid].b) > 0){l = mid+1;}else{r = mid;}}if(crossProduct(p0,line[l].a,line[l].b) < 0) cnt[l]++;else cnt[l+1]++;}intmain(){int n,m,x1,y1,x2,y2,t1,t2,ct;int key[Maxsize];while(scanf("%d",&n) && n){    scanf("%d %d %d %d %d",&m,&x1,&y1,&x2,&y2);    ct = 0;memset(cnt,0,sizeof(cnt));memset(key,0,sizeof(key));for(int i = 0 ; i < n ; i++){scanf("%d %d",&t1,&t2);line[ct].a.x = t1;line[ct].b.x = t2;line[ct].a.y = y1;line[ct++].b.y = y2;}sort(line,line+n,cmp);/*对线段进行排序*/for(int i = 0 ; i < m ; i++){point p;scanf("%d %d",&p.x,&p.y);found(p,n);}int Maxcost = -1;for(int i = 0 ; i <= n ; i++){if(Maxcost < cnt[i]){Maxcost = cnt[i];}}for(int i = 1 ; i <= Maxcost ; i++)/*统计有相同玩具数量的箱子的个数*/{for(int j = 0 ; j <= n ; j++){if(cnt[j] == i){key[i]++;}}}printf("Box\n");for(int i = 1 ; i <= Maxcost ; i++){if(key[i]){printf("%d: %d\n",i,key[i]);}}}return 0;}