题目详情

资源限制

内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s

问题描述

平面上有 N 条直线,其中第 i 条直线是 y=Ai⋅x+Bi。

请计算这些直线将平面分成了几个部分。

输入格式

第一行包含一个整数 N。

以下N行,每行包含两个整数 Ai,Bi。

输出格式

一个整数代表答案。

样例输入

  1. 3
    1 1
    2 2
    3 3

Data

样例输出

  1. 6

评测用例规模与约定

对于 50 的评测用例,1≤N≤4, −10≤Ai,Bi≤10。

对于所有评测用例,1≤N≤1000, −100000≤Ai,Bi≤100000。

考点

去重,思路

思路:

对于第一条线,它会将平面分成两个部分,对于之后每加入一条线:

  • 如果与其它线互不相交:1、平行,那么会多划分出一个平面(+1)。2、重合,不会发生改变

  • 如果与其它线相交:那么每产生一个交点,就会额外多划分一个平面(+2)。这里有一点要注意:当产生的交点中有重复的点,只需要算一次即可

可以发现在判断线和点时都需要进行去重,对于所有不重合的线,保底会使的平面划分+1,当产生新的交点时,会额外使平面划分+1

以下三种情况是可能的图像:

代码

  1. 1 import java.util.ArrayList;
  2. 2 import java.util.HashSet;
  3. 3 import java.util.List;
  4. 4 import java.util.Scanner;
  5. 5 import java.util.Set;
  6. 6
  7. 7 public class Main {
  8. 8 static class Pair {
  9. 9 double a;
  10. 10 double b;
  11. 11
  12. 12 public Pair(double a, double b) {
  13. 13 this.a = a;
  14. 14 this.b = b;
  15. 15
  16. 16 }
  17. 17
  18. 18 // 重写hashCode方法
  19. 19 // hasCode不能直接判断两个值相等,但能直接判断两个值不相等
  20. 20 // 相当于做了一个预处理
  21. 21 @Override
  22. 22 public int hashCode() {
  23. 23 return (int) a;
  24. 24 }
  25. 25
  26. 26 // 重写equals方法
  27. 27 @Override
  28. 28 public boolean equals(Object obj) {
  29. 29 // TODO Auto-generated method stub
  30. 30 Pair p = (Pair) obj;
  31. 31 return this.a == p.a && this.b == p.b;
  32. 32 }
  33. 33 }
  34. 34
  35. 35 public static void main(String args[]) {
  36. 36 Scanner in = new Scanner(System.in);
  37. 37 Set<Pair> set = new HashSet<>();
  38. 38 Set<Pair> point = new HashSet<>();
  39. 39 int n = in.nextInt();
  40. 40 for (int i = 0; i < n; i++) {
  41. 41 double a = in.nextDouble();
  42. 42 double b = in.nextDouble();
  43. 43 set.add(new Pair(a, b));
  44. 44 }
  45. 45 int len = set.size();
  46. 46 List<Pair> arr = new ArrayList<>();
  47. 47 arr.addAll(set);
  48. 48 int ans = 2;// 第一条直线把平面分成两块
  49. 49 for (int i = 1; i < len; i++) {
  50. 50 point.clear();// 记得清零
  51. 51 for (int j = 0; j < i; j++) {
  52. 52 double a1 = arr.get(i).a;
  53. 53 double a2 = arr.get(j).a;
  54. 54 double b1 = arr.get(i).b;
  55. 55 double b2 = arr.get(j).b;
  56. 56 if (a1 == a2)
  57. 57 continue; // 平行没有交点
  58. 58 double x = (b2 - b1) / (a1 - a2);
  59. 59 double y = a1 * x + b1;
  60. 60 point.add(new Pair(x, y));// 将交点去重
  61. 61 }
  62. 62 ans += (point.size() + 1);// +1是默认的
  63. 63 }
  64. 64 System.out.println(ans);
  65. 65 }
  66. 66 }

关于Set自定义类型的去重

首先我们要知道Set去重的原理,它要判断两个元素是否相同,若不相同则允许加入,相同则拒绝加入。

而判断的依据就是通过元素类中的hasCode函数和equals函数。

所以当我们想要用Set对自定义类去重时,要重写这两个函数。

equals()

  1. @Override
    public boolean equals(Object obj) {
    // TODO Auto-generated method stub
    Pair p = (Pair) obj;
    return this.a == p.a && this.b == p.b;
    }

顾名思义,用来判断两个元素在满足什么样的条件被认为是“相同”的,这个条件可以自己来定。

hasCode()

  1. @Override
    public int hashCode() {
    return (int) a;
    }

返回值为int型的函数,主要用来在散列存储结构中确定对象的位置。

当我们用Set去重的时候,如果对每个元素都要进行一次相等比较,开销非常大,所以在集合要添加新的对象时,先调用这个对象的hashCode方法,得到对应的hashcode值,如果之前没有出现过改hashcode值,它就可以直接存进去,不用再进行任何比较了;如果存在该hashcode值, 就调用它的equals方法与新元素进行比较。

我觉得hasCode是对于数据做了一个预处理,帮助减少equals的使用次数,如果两个对象的hasCode值都不同,那么元素本身肯定也不相同

记住,equals判断相等,hasCode判断不相等

蓝桥杯真题 平面切分(Set自定义去重)的更多相关文章

  1. 【蓝桥杯真题】地宫取宝(搜索->记忆化搜索详解)

    链接 [蓝桥杯][2014年第五届真题]地宫取宝 题目描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被 ...

  2. Java实现 LeetCode 887 鸡蛋掉落(动态规划,谷歌面试题,蓝桥杯真题)

    887. 鸡蛋掉落 你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N 共有 N 层楼的建筑. 每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去. 你知道存在楼层 F ,满足 0 < ...

  3. bfs记录路径,蓝桥杯真题

    题意:在01矩阵中,找到一条从入口到终点的最短路径,并且打印这条路径. 题目链接:http://lx.lanqiao.cn/problem.page?gpid=T291 #include<ios ...

  4. 蓝桥杯vip题阶乘计算

    蓝桥杯vip题阶乘计算 详细题目 输入一个正整数n,输出n!的值. 其中n!=123*-*n. 算法描述 n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法.使用一个数组A来表示一个 ...

  5. Java实现UVA10131越大越聪明(蓝桥杯每周一题)

    10131越大越聪明(蓝桥杯每周一题) [问题描述] 一些人认为,大象的体型越大,脑子越聪明.为了反驳这一错误观点,你想要分析一组大象的数据,找出尽量 多的大象组成一个体重严格递增但 IQ 严格递减的 ...

  6. 取球游戏_nyoj_518(博弈-蓝桥杯原题).java

    取球游戏 时间限制: 1000 ms  |  内存限制: 65535 KB 难度: 2   描述 今盒子里有n个小球,A.B两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下 ...

  7. java算法 蓝桥杯(题+答案) 方格填数

    6.方格填数  (结果填空) 如下的10个格子 (如果显示有问题,也可以参看[图1.jpg]) 填入0~9的数字.要求:连续的两个数字不能相邻.(左右.上下.对角都算相邻) 一共有多少种可能的填数方案 ...

  8. 2019第十届蓝桥杯 E题 迷宫

    /*输入 30 50 01010101001011001001010110010110100100001000101010 00001000100000101010010000100000001001 ...

  9. java算法 蓝桥杯(题+答案) 压缩变换

    10.压缩变换  (程序设计) 小明最近在研究压缩算法.他知道,压缩的时候如果能够使得数值很小,就能通过熵编码得到较高的压缩比.然而,要使数值很小是一个挑战. 最近,小明需要压缩一些正整数的序列,这些 ...

  10. 蓝桥杯九宫重排(bfs+用set去重)

    题目连接 #define _CRT_SECURE_NO_WARNINGS #include<cstdio> #include<iostream> #include<que ...

随机推荐

  1. CentOS /RHEL 系统更新安全补丁的方法

    在 Linux 系统上,其中一个最重要的需求就是保持定期更新最新的安全补丁,或者为相应的 Linux 版本更新可用的安全补丁.在这篇文章中,我们将分享如何在 CentOS/RHEL 7/6 版本中设置 ...

  2. Java笔记第六弹

    字符缓冲流 //构造方法 BufferedWriter(Writer out); BufferedReader(Reader in); 相关应用: import java.io.*; public c ...

  3. IDEA-日志管理神器

    Grep Console-插件的好处就在于能使控制台输出日志时,可以直接修改插件中定义好的规则,也可以根据自己定义的规则,输出不同的颜色.这样就可以将错误信息标记成显眼的颜色,方便查看,提高bug寻找 ...

  4. 搭建良好编写体验的webgl编程环境 vscode+vit

    因为webgl代码是以字符串的形式嵌入在javascript代码中,这对于我们编写webgl代码的体验不友好,本文介绍如何搭建友好webgl编程环境: 需要安装的vscode插件 WebGL GLSL ...

  5. IDEA2022中部署Tomcat Web项目

    使用工具: IDEA2022 Tomcat9.0.4 1.下载Tomcat: 官网:https://tomcat.apache.org/ 找到需要的版本下载即可,下载完成解压即可用: Tomcat目录 ...

  6. 2020寒假学习笔记15------Spark基础实验

    今天又开始重新做实验六,第一题做的比较顺利,运行结果如下: 等到第二题就出现了各种各样的错误,开始运行telnet localhost 44444命令时出现bash: telnet: command ...

  7. Go语言:通过TDD驱动测试开发为同事写的程序优化提速——初次接触并发与channel

    正文: 假如同事已经写了一个 CheckWebsites 的函数检查 URL 列表的状态. package concurrency type WebsiteChecker func(string) b ...

  8. MongoDB基础知识梳理

    简介 MongoDB 是由 C++ 编写的开源 NoSQL 和基于文档的数据库.MongoDB 提供了面向文档的存储方式,操作起来比较简单和容易,支持"无模式"的数据建模,可以存储 ...

  9. 搭建react的架手架

    1.回顾 cnpm i @vue/cli -g ----- 4的脚手架 ------ webpack 4 cnpm i @vue/cli@3 -g ----- 3的脚手架 ------ webpack ...

  10. python标准模块之subprocess

    subprocess --- 子进程管理 源代码: Lib/subprocess.py 写在前面: 感觉也就这俩有用: subprocess.run() subprocess.Popen()   w下 ...