POJ 2318 TOYS(计算几何)
题目大意:有一个矩形盒子,盒子里会有一些木块线段,并且这些线段是按照顺序给出的,有n条线段,把盒子分层了n+1个区域,然后有m个玩具,这m个玩具的坐标是已知的,问最后每个区域有多少个玩具
解题思路:因为线段是有序给出,所以不用排序,判断某个点在哪个区域,采用二分法,将某个点和线段的叉积来判断这个点是在线的左边或者右边,根据这个来二分找出区域
代码和思路参考与此链接:http://blog.csdn.net/wangjian8006
这也算我入门计算几何的第一道题了,首先看了一些有关资料,了解到叉积的重要性!!有2点,p1,p2构成一条线段L,L左边有一点p3,右边有一点p4,则(p1-p2)x(p3-p1)>0,(p1-p2)x(p4-p1)<0。
也就是说在L左边的点叉积>0,右边的<0。
剩下的就是二分找答案了,在记录到数组中,最后输出。
#include <iostream>
using namespace std;
#define _MAXL_ 5010 typedef struct{
int x, y;
}POINT; typedef struct{
POINT first,second;
}LINE; class CBox{
private:
int nTop,nLeft,nRight,nButtom;
int nCountLine; //记录盒子里有多少条线
LINE *pLine; //记录线的信息
int *pRange; //记录区间中的玩具有多少个
int Multi(POINT p1,POINT p2,POINT p0); //叉积计算
public:
CBox();
virtual ~CBox();
void SetBorder(int top,int left,int right,int buttom); //设置盒子矩形坐标
void AddLine(int first,int second); //在盒子中增加一条线
int GetRange(int val); //得到某个区间中的玩具个数
void SetToy(POINT toy); //在盒子里放一个玩具
}; CBox::CBox(){
nCountLine = 0;
pLine = new LINE[_MAXL_];
pRange = new int[_MAXL_];
memset(pRange,0,sizeof(pRange)*_MAXL_);
} CBox::~CBox(){
delete []pLine;
delete []pRange;
} void CBox::SetBorder(int top,int left,int right,int buttom){
nTop = top;
nLeft = left;
nRight = right;
nButtom = buttom;
} void CBox::AddLine(int topx,int buttomx){
pLine[nCountLine].first.x = topx;
pLine[nCountLine].first.y = nTop;
pLine[nCountLine].second.x = buttomx;
pLine[nCountLine].second.y = nButtom;
nCountLine++;
} int CBox::GetRange(int val){
return pRange[val];
} int CBox::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 CBox::SetToy(POINT toy){ //利用二分查找,查找出该点在哪个区间
int l, r, mid;
l=0,r=nCountLine-1;
while (l < r){
mid = (l+r)>>1;
if (Multi(toy, pLine[mid].first, pLine[mid].second) > 0) l = mid + 1;
else r = mid;
}
if (Multi(toy, pLine[l].first, pLine[l].second) < 0) pRange[l]++;
else pRange[l+1]++;
} int main(){
int i,fx,lx;
POINT a,b;
int n,m;
while(cin>>n && n){
cin>>m>>a.x>>a.y>>b.x>>b.y;
CBox box;
box.SetBorder(a.y,a.x,b.x,b.y);
for(i = 0;i < n;i++){
cin>>fx>>lx;
box.AddLine(fx,lx);
} for(i = 0;i < m;i++){
cin>>a.x>>a.y;
box.SetToy(a);
} for(i = 0;i <= n;i++){
cout<<i<<": "<<box.GetRange(i)<<endl;
}
cout<<endl;
}
return 0;
}
POJ 2318 TOYS(计算几何)的更多相关文章
- poj 2318 TOYS(计算几何 点与线段的关系)
TOYS Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 12015 Accepted: 5792 Description ...
- POJ 2318 TOYS(计算几何)
跨产品的利用率推断点线段向左或向右,然后你可以2分钟 代码: #include <cstdio> #include <cstring> #include <algorit ...
- POJ 2318 TOYS(叉积+二分)
题目传送门:POJ 2318 TOYS Description Calculate the number of toys that land in each bin of a partitioned ...
- poj 2318 TOYS (二分+叉积)
http://poj.org/problem?id=2318 TOYS Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 101 ...
- 简单几何(点与线段的位置) POJ 2318 TOYS && POJ 2398 Toy Storage
题目传送门 题意:POJ 2318 有一个长方形,用线段划分若干区域,给若干个点,问每个区域点的分布情况 分析:点和线段的位置判断可以用叉积判断.给的线段是排好序的,但是点是无序的,所以可以用二分优化 ...
- POJ 2318 TOYS && POJ 2398 Toy Storage(几何)
2318 TOYS 2398 Toy Storage 题意 : 给你n块板的坐标,m个玩具的具体坐标,2318中板是有序的,而2398无序需要自己排序,2318要求输出的是每个区间内的玩具数,而231 ...
- 向量的叉积 POJ 2318 TOYS & POJ 2398 Toy Storage
POJ 2318: 题目大意:给定一个盒子的左上角和右下角坐标,然后给n条线,可以将盒子分成n+1个部分,再给m个点,问每个区域内有多少各点 这个题用到关键的一步就是向量的叉积,假设一个点m在 由ab ...
- poj 2318 TOYS & poj 2398 Toy Storage (叉积)
链接:poj 2318 题意:有一个矩形盒子,盒子里有一些木块线段.而且这些线段坐标是依照顺序给出的. 有n条线段,把盒子分层了n+1个区域,然后有m个玩具.这m个玩具的坐标是已知的,问最后每一个区域 ...
- 【POJ】2318 TOYS ——计算几何+二分
TOYS Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10281 Accepted: 4924 Description ...
- 2018.07.03 POJ 2318 TOYS(二分+简单计算几何)
TOYS Time Limit: 2000MS Memory Limit: 65536K Description Calculate the number of toys that land in e ...
随机推荐
- UVa 489 HangmanJudge --- 水题
UVa 489 题目大意:计算机给定一个单词让你猜,你猜一个字母,若单词中存在你猜测的字母,则会显示出来,否则算出错, 你最多只能出错7次(第6次错还能继续猜,第7次错就算你失败),另注意猜一个已经猜 ...
- linux 命令-全称
cal = CALendar calendar日历, 历法cat = CATenate 连接, 使连续cd = Change Directorychgrp = CHange GRouPchmod = ...
- P364 实战练习(多线程)
尝试定义一个继承Thread类的类,并覆盖run( )方法,在run( )方法中每隔1000毫秒打印一句话. 编写代码如下: 编写PractiseThread类: package org.hanqi. ...
- hdu3639 强连通
题意:有 n 个人,m 组支持关系,已知支持关系可以传递,比如 A 支持 B,则所有支持 A 的人也同时支持 B,问哪些人获得的支持数最多,最多获得多少支持(自己不能获得自己的支持). 首先,如果一些 ...
- JSBinding + SharpKit / 安装SharpKit以及添加SharpKit工程
本文说明如何往 sln 中添加 SharpKit 工程,以及配置. SharpKit 工程用于将 C# 源代码编译成 JS 代码. QQ群 189738580 1. 安装SharpKit 到 sha ...
- 基于OkHttp的封装库TigerOkHttp的使用
在前面熟悉了OkHttp的用法之后,为了简化用法同时适用于我的项目,我针对OkHttp进行了更进一步的封装(源码及其Demo地址在https://github.com/huyongli/TigerOk ...
- WCF入门教程五[WCF的通信模式]
一.概述 WCF在通信过程中有三种模式:请求与答复.单向.双工通信.以下我们一一介绍. 二.请求与答复模式 描述: 客户端发送请求,然后一直等待服务端的响应(异步调用除外),期间处于假死状态,直到服务 ...
- WebAPI Post类型传参报错“找不到与该请求匹配的操作”
错误内容: Message=未找到与请求 URI“http://localhost:42914/api/Products/Login”匹配的 HTTP 资源. MessageDetail=在控制器“P ...
- HDP2.4安装(四):ambari安装
ambari是apache基金会的开源项目,它的优势在于巧妙溶合已有的开源软件,提供集群自动化安装.中心化管理.集群监控.报警等功能.据Hortonwork官方资料介绍,不同的HDP版本,对ambar ...
- [nginx]Nginx禁止访问robots.txt防泄漏web目录
关于robots.txt文件:搜索引擎通过一种程序robot(又称spider),自动访问互联网上的网页并获取网页信 息.您可以在您的网站中创建一个纯文本文件robots.txt,在这个文件中声明该网 ...