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

题意:

给定一个如上的长方形箱子,中间有n条线段,将其分为n+1个区域,给定m个玩具的坐标,统计每个区域中的玩具个数。(其中这些线段有序且不相交)

解答:

因为线段是有序给出,所以不用排序,判断某个点在哪个区域,采用二分法,将某个点和线段的叉积来判断这个点是在线的左边或者右边,根据这个来二分找出区域。

这是第一道计算几何的题目,怎么说呢,对于二分的边界问题还有点搞不清楚,这次是对线段二分,感觉二分真的很有用处。

开阔思维!!!具体请看代码。

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <queue>
#define inf 0x3f3f3f3f
#define eps 1e-9
typedef long long ll;
using namespace std;
int n,m,x,y,x2,y2,temp;
int a[][],point[][],sum[]; void er(int l,int r,int keyx,int keyy)
{
ll X1,Y1,X2,Y2;
int mid;
while(l<r)
{
mid=l+(r-l)/;
X1=a[mid][]-keyx;
Y1=y-keyy;
X2=a[mid][]-keyx;
Y2=y2-keyy;
if(X1*Y2-X2*Y1<=)
r=mid;
else l=mid+;
}
sum[l]++;
}
int main()
{
while(scanf("%d",&n)!=EOF&&n!=)
{
scanf("%d%d%d%d%d",&m,&x,&y,&x2,&y2);
for(int i=; i<n; i++)
scanf("%d%d",&a[i][],&a[i][]);
a[n][]=a[n][]=x2;//保证所有点都能找到叉积<=0的线段
for(int i=; i<m; i++)
{
scanf("%d%d",&point[i][],&point[i][]);
}
memset(sum,,sizeof(sum));
for(int i=; i<m; i++)
{
er(,n,point[i][],point[i][]);
}
for(int i=; i<=n; i++)
{
printf("%d: %d\n",i,sum[i]);
}
cout<<endl;
}
return ;
}

大神写的规范代码:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; struct Point {
int x, y;
}; struct Line {
Point a, b;
} line[]; int cnt[]; int Multi(Point p1, Point p2, Point p0) {
return (p1.x - p0.x) * (p2.y - p0.y) - (p2.x - p0.x) * (p1.y - p0.y);
} void BSearch(Point a, int n) {
int l, r, mid; l = ; r = n-;
while (l < r) {
mid = (l + r) >> ;
if (Multi(a, line[mid].a, line[mid].b) > ) l = mid + ;
else r = mid;
}
if (Multi(a, line[l].a, line[l].b) < ) cnt[l]++;
else cnt[l+]++;
} int main()
{
int n, m, x1, y1, x2, y2;
int i, t1, t2;
Point a; while (scanf ("%d", &n) && n) {
scanf ("%d%d%d%d%d", &m, &x1, &y1, &x2, &y2);
for (i = ; i < n; i++) {
scanf ("%d%d", &t1, &t2);
line[i].a.x = t1;
line[i].a.y = y1;
line[i].b.x = t2;
line[i].b.y = y2;
}
memset(cnt, , sizeof (cnt));
for (i = ; i < m; i++) {
scanf ("%d%d", &a.x, &a.y);
BSearch(a, n);
}
for (i = ; i <= n; i++)
printf ("%d: %d\n", i, cnt[i]);
printf("\n");
}
return ;
}

POJ2398:

本题和poj2318 TOYS大致一样,但有一些不同。

1:输入是无序的,需要自己排序。

2:输出是输出拥有相同玩具数的区块有几个。     (区块里的玩具数:相同玩具数的区块个数)

知道题意就很好做了。

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <queue>
#define inf 0x3f3f3f3f
#define eps 1e-9
typedef long long ll;
using namespace std;
int n,m,x,y,x2,y2,temp;
int point[][],sum[];
struct node
{
int a1,a2;
} a[];
int cmp(const void *a,const void *b)
{
struct node *aa=(struct node *)a;
struct node *bb=(struct node *)b;
return aa->a1-bb->a1;
}
void er(int l,int r,int keyx,int keyy)
{
ll X1,Y1,X2,Y2;
int mid;
while(l<r)
{
mid=l+(r-l)/;
X1=a[mid].a1-keyx;
Y1=y-keyy;
X2=a[mid].a2-keyx;
Y2=y2-keyy;
if(X1*Y2-X2*Y1<=)
r=mid;
else l=mid+;
}
sum[l]++;
}
int main()
{
while(scanf("%d",&n)!=EOF&&n!=)
{
scanf("%d%d%d%d%d",&m,&x,&y,&x2,&y2);
for(int i=; i<n; i++)
scanf("%d%d",&a[i].a1,&a[i].a2);
a[n].a1=a[n].a2=x2;
qsort(a,n+,sizeof(a[]),cmp);
for(int i=; i<m; i++)
{
scanf("%d%d",&point[i][],&point[i][]);
}
memset(sum,,sizeof(sum));
for(int i=; i<m; i++)
{
er(,n,point[i][],point[i][]);
}
printf("Box\n");
int ha[];
memset(ha,,sizeof(ha));
for(int i=; i<=m; i++)
{
if(sum[i])
ha[sum[i]]++;
}
for(int i=; i<=; i++)
{
if(ha[i]) printf("%d: %d\n",i,ha[i]);
}
}
return ;
}

POJ2318:TOYS(叉积判断点和线段的关系+二分)&&POJ2398Toy Storage的更多相关文章

  1. POJ 2398 Toy Storage (叉积判断点和线段的关系)

    题目链接 Toy Storage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4104   Accepted: 2433 ...

  2. POJ 2398 Toy Storage(计算几何,叉积判断点和线段的关系)

    Toy Storage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3146   Accepted: 1798 Descr ...

  3. POJ2318 TOYS(叉积判断点与直线的关系+二分)

    Calculate the number of toys that land in each bin of a partitioned toy box. Mom and dad have a prob ...

  4. poj2318(叉积判断点在直线左右+二分)

    题目链接:https://vjudge.net/problem/POJ-2318 题意:有n条线将矩形分成n+1块,m个点落在矩形内,求每一块点的个数. 思路: 最近开始肝计算几何,之前的几何题基本处 ...

  5. POJ2318 TOYS[叉积 二分]

    TOYS Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 14433   Accepted: 6998 Description ...

  6. [poj2318]TOYS(直线与点的位置关系)

    解题关键:计算几何入门题,通过叉积判断. 两个向量的关系: P*Q>0,Q在P的逆时针方向: P*Q<0,Q在P的顺时针方向: P*Q==0,Q与P共线. 实际就是用右手定则判断的. #i ...

  7. POJ-2318 TOYS 计算几何 判断点在线段的位置

    题目链接:https://cn.vjudge.net/problem/POJ-2318 题意 在一个矩形内,给出n-1条线段,把矩形分成n快四边形 问某些点在那个四边形内 思路 二分+判断点与位置关系 ...

  8. TOYS - POJ 2318(计算几何,叉积判断)

    题目大意:给你一个矩形的左上角和右下角的坐标,然后这个矩形有 N 个隔板分割成 N+1 个区域,下面有 M 组坐标,求出来每个区域包含的坐标数.   分析:做的第一道计算几何题目....使用叉积判断方 ...

  9. poj 2318(叉积判断点在线段的哪一侧)

    TOYS Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13120   Accepted: 6334 Description ...

随机推荐

  1. Servlet中Request的getAttribute getParameter 区别

    1.从更深的层次考虑,request.getParameter()方法传递的数据,会从Web客户端传到Web服务器端,代表HTTP请求数据. request.getParameter()方法返回Str ...

  2. Unity UGUI 实现简单拖拽功能

    说到拖拽,那必然离不开坐标,UGUI 的坐标有点不一样,它有两种坐标,一种是屏幕坐标,还有一种就是 UI 在Canvas内的坐标(暂时叫做ugui坐标),这两个坐标是不一样的,所以拖拽就需要转换. 因 ...

  3. Elixir语言

    Elixir是一个基于Erlang VM的函数式元编程语言(类似Ruby),通过动态语言的灵活的语法和宏能够利用Erlang建立一个并发 分布 失败冗余的高质量代码

  4. YII2与Thinkphp整合阿里云OSS

    前言: 如果上传的文件都和网站程序源代码放在一起:那是有相当多的弊端的: 1:静态文件会占用大量带宽: 2:服务器的成本略高: 常规的做法是把php源代码放到一台服务器上:图片等静态文件放在另一台服务 ...

  5. AWS系列-复制AMI到其他区域

    复制AMI镜像到其他区域 1.1 打开EC2控制面板,找到AMI 选择需要迁移的AMI 1.2 选择复制的目标区域 选择复制到目标区域 我这里是 东京复制到新加坡 1.3 点击完成后,切换到相应的区域 ...

  6. android APP上线前,应该准备的东西

    这里给出一些主流的应用市场名单,有些可能已经不行了,自己找一找,很容易的: 应用市场图-1

  7. 《C++ Primer Plus》第5章 循环和关系表达式 学习笔记

    C++提供了3种循环: for 循环. while 循环 和 do while 循环 .如果循环测试条件为 true 或非零,则循环将重复执行一组指令: 如果测试条件为 false 或 0 , 则结束 ...

  8. JSP小例子——以Model1的思想实现用户登录小例子(不涉及DB操作)

    Model1简介现在比较流行的就是Model1和Model2,这里介绍Model1.在Model1模型出现前,整个Web应用的情况是:几乎全部由JSP页面组成,JSP页面接受处理客户端请求,对请求处理 ...

  9. Myeclipse创建Maven项目

    1.右击new创建一个Maven Project: 点击Next 继续Next Finish 2.项目成功创建后,项目目录主要有:主代码目录.主资源目录.测试代码目录.测试资源目录.输出目录(代码编译 ...

  10. Linux 下8种优秀的屏幕录制机

    导读 屏幕录制机已经成为常见的和良好的实践来记录一个重要桌面会话,例如,你想玩一个难度较大的游戏,并且向记录是如何完成的,或者你打算创建一个视频教程,入门文章或指南,或任何其他活动和记录你的桌面会话, ...