4309 消灭老鼠(哈希表存储一个向量表示一条直线)
1. 问题描述:
约翰的农场可以看作一个二维平面。农场中有 n 个老鼠,在毁坏着农田。第 i 个老鼠的位置坐标为 (xi,yi)。不同老鼠可能位于同一位置。在 (x0,y0) 处,装有一个双向发射的激光枪,该位置没有老鼠。激光枪每次发射都可以将穿过点 (x0,y0) 的某一条直线上的所有老鼠都消灭掉。请问,为了消灭所有老鼠,至少需要激光枪发射几次。
输入格式
第一行包含三个整数 n,x0,y0,表示共有 n 只老鼠,激光枪的位置为 (x0,y0)。接下来 n 行,每行包含两个整数 xi,yi,表示第 i 只老鼠的位置为 (xi,yi)。
输出格式
一个整数,表示激光枪的最少发射次数。
数据范围
前 5 个测试点满足 1 ≤ n ≤ 5。
所有测试点满足 1 ≤ n ≤ 1000,−10 ^ 4 ≤ xi,yi ≤ 10 ^ 4。
输入样例1:
4 0 0
1 1
2 2
2 0
-1 -1
输出样例1:
2
输入样例2:
2 1 2
1 1
1 0
输出样例2:
1
来源:https://www.acwing.com/problem/content/4312/
2. 思路分析:
分析题目可以知道实际上我们需要求解的是所有点与源点(x0,y0)构成的直线的数目,所以我们需要根据点与点的坐标计算出直线的斜率这样两个点就可以确定一条直线,所以问题就转化为了如何对直线进行判重?也即判断他们是否是重合的,一般有两种方法:① 计算斜率k和截距b,k和b相同那么所有点都在这条直线上;② 存储一个向量(x - x0, y - y0)用来标识一条直线;由于第一种方法计算斜率k的时候有可能会产生精度问题,而第二种方法存储的其实是一个向量那么是没有精度问题的,一般采取第二种方法来存储,这样可以标识一条直线,并且这个向量应该是最简的,也即x - x0和 y - y0的最大公约数为1,这样就可以唯一标识直线的方向,由于向量是有方向的,所以我们固定x - x0是正的这样相对方向就确定了,使用哈希表记录所有标识直线的向量即可,最终哈希表的大小就是直线的条数。
3. 代码如下:
class Solution:# 求解a, b的最大公约数def gcd(self, a: int, b: int):return a if b == 0 else self.gcd(b, a % b)def process(self):n, x0, y0 = map(int, input().split())mp = dict()for i in range(n):x, y = map(int, input().split())x -= x0y -= y0# 求解x和y的最大公约数最终x, y才是最简的g = self.gcd(x, y)# (x, y)表示一个向量x //= gy //= gif x < 0:# 将第一个数字变为正数这样相对方向就固定了, 例如(1, 1)和(-1, -1)标识的其实是一条直线x = -xy = -ymp[(x, y)] = 1return len(mp)if __name__ == '__main__':print(Solution().process())
4309 消灭老鼠(哈希表存储一个向量表示一条直线)相关推荐
- Leetcode 146. LRU缓存机制【哈希表 [哈希表存储每个元素在双向链表中的指针]+双向链表】
文章目录 问题描述 解题报告 实验代码 参考资料 问题描述 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . ...
- leetcode每日一题1725. 可以形成最大正方形的矩形数目 哈希表存储 到 贪心遍历 优化~
- 两条线段相切弧_怎样绘制一个与两条直线相切的圆弧
Document 注意: 1. ctx.arcTo() 可以绘制与两条直线相切的圆弧; 2. function draw() { var canvas = document.getElementByI ...
- LeetBook哈希表专题题解(详解/一题多解)
哈希表 文章目录 哈希表 设计哈希表 设计哈希集合(set) (超大数组法) (拉链法1(list实现)) (拉链法2(模拟实现单链表+虚拟头节点)) (拉链法3(模拟单链表不叫虚拟头节点)) 设计哈 ...
- HashSet集合存储数据的结构(哈希表)
HashSet集合存储数据的结构(哈希表) 什么是哈希表呢? 在JDK1.8之前,哈希表底层采用数组+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里.但是当位于一个桶中的元素较多 ...
- 哈希表企业应用-淘宝分布式文件系统核心存储引擎
哈希表企业应用-淘宝分布式文件系统核心存储引擎-基本概述 淘宝网 谁都知道 是一个电子商务网站,可能是第一批电商模式 b2c 当然从一个技术人员讲只有一点 淘宝店铺商品存储到哪里 感觉有点像废话 :肯 ...
- PHP哈希表碰撞攻击原理
哈希表碰撞攻击(Hashtable collisions as DOS attack)的话题不断被提起,各种语言纷纷中招.本文结合PHP内核源码,聊一聊这种攻击的原理及实现. 哈希表碰撞攻击的基本原理 ...
- 散列表查找(哈希表)
散列函数构造经常要考虑: 1.散列表的长度 2.关键字的长度 3.关键字的分布情况 4.计算散列函数所需的时间 5.记录的查找频率 一个"好"的散列函数应遵循一下两条原则 (1)函 ...
- 散列表(也叫哈希表),
google搜索到的头条:散列表(也叫哈希表),是根据关键码值直接进行访问的数据结构,也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列函数,存放记录的数组 ...
- 哈希表查找速度为什么那么快?快在哪里了?
先看数组存储数据是怎么样的. 现在有一个数组,它里面每个单元存储的是数据的地址 这叫指针数组吧,假设它有100个单元 我们称他为p[100] 现在我想把一百个数据(地址)放到里面 我们想把某个数据放到 ...
最新文章
- 破解phpstorm2017.3.1版本并解决win10下修改hosts问题
- Mongoose快速入门
- rabbitmq学习:
- mysql end case连接_MySql 中 case when then else end 的用法
- 计算机考试用户名和密码,计算机模块考试忘记了用户名和密码怎么办
- Atitit it业界与软件界的定律 原则 准则 法则 效应
- 牛顿插值法的Python程序
- 个人成长(学习方法)
- 原生PHP配置paypal支付接口成功!不用Composer!
- hr面试性格测试30题_网友应聘华为表现优秀,最终却挂在性格测试上,看真题我哭……...
- Excel怎么合并单元格
- 【猴博士】概率论与数理统计 笔记总结(完结)
- 彩色二维码生成器,带logo文字和中心文字
- 【认知觉醒:开启自我改变的原动力】
- 全网最全开源工业缺陷数据集汇总
- vue路由报错Navigating to current location (“/login“) is not allowed踩坑总结
- UVA 10881 Piotr‘s Ants
- Android显示系统键盘的方法,Android 显示和隐藏软键盘
- 定积分的计算与辛普森积分及龙贝格积分
- Ubuntu 16.04 安装 vivado2018.3