您的位置:首页 > 其它

TOYS--POJ2318

2016-04-18 19:49 399 查看
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
;
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
;
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\n",i,a[i]);
}
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: