蓝桥杯真题 平面切分(Set自定义去重)
题目详情
资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
平面上有 N 条直线,其中第 i 条直线是 y=Ai⋅x+Bi。
请计算这些直线将平面分成了几个部分。
输入格式
第一行包含一个整数 N。
以下N行,每行包含两个整数 Ai,Bi。
输出格式
一个整数代表答案。
样例输入
3
1 1
2 2
3 3
Data
样例输出
6
评测用例规模与约定
对于 50 的评测用例,1≤N≤4, −10≤Ai,Bi≤10。
对于所有评测用例,1≤N≤1000, −100000≤Ai,Bi≤100000。
考点
去重,思路
思路:
对于第一条线,它会将平面分成两个部分,对于之后每加入一条线:
如果与其它线互不相交:1、平行,那么会多划分出一个平面(+1)。2、重合,不会发生改变
如果与其它线相交:那么每产生一个交点,就会额外多划分一个平面(+2)。这里有一点要注意:当产生的交点中有重复的点,只需要算一次即可
可以发现在判断线和点时都需要进行去重,对于所有不重合的线,保底会使的平面划分+1,当产生新的交点时,会额外使平面划分+1
以下三种情况是可能的图像:

代码
1 import java.util.ArrayList;
2 import java.util.HashSet;
3 import java.util.List;
4 import java.util.Scanner;
5 import java.util.Set;
6
7 public class Main {
8 static class Pair {
9 double a;
10 double b;
11
12 public Pair(double a, double b) {
13 this.a = a;
14 this.b = b;
15
16 }
17
18 // 重写hashCode方法
19 // hasCode不能直接判断两个值相等,但能直接判断两个值不相等
20 // 相当于做了一个预处理
21 @Override
22 public int hashCode() {
23 return (int) a;
24 }
25
26 // 重写equals方法
27 @Override
28 public boolean equals(Object obj) {
29 // TODO Auto-generated method stub
30 Pair p = (Pair) obj;
31 return this.a == p.a && this.b == p.b;
32 }
33 }
34
35 public static void main(String args[]) {
36 Scanner in = new Scanner(System.in);
37 Set<Pair> set = new HashSet<>();
38 Set<Pair> point = new HashSet<>();
39 int n = in.nextInt();
40 for (int i = 0; i < n; i++) {
41 double a = in.nextDouble();
42 double b = in.nextDouble();
43 set.add(new Pair(a, b));
44 }
45 int len = set.size();
46 List<Pair> arr = new ArrayList<>();
47 arr.addAll(set);
48 int ans = 2;// 第一条直线把平面分成两块
49 for (int i = 1; i < len; i++) {
50 point.clear();// 记得清零
51 for (int j = 0; j < i; j++) {
52 double a1 = arr.get(i).a;
53 double a2 = arr.get(j).a;
54 double b1 = arr.get(i).b;
55 double b2 = arr.get(j).b;
56 if (a1 == a2)
57 continue; // 平行没有交点
58 double x = (b2 - b1) / (a1 - a2);
59 double y = a1 * x + b1;
60 point.add(new Pair(x, y));// 将交点去重
61 }
62 ans += (point.size() + 1);// +1是默认的
63 }
64 System.out.println(ans);
65 }
66 }
关于Set自定义类型的去重
首先我们要知道Set去重的原理,它要判断两个元素是否相同,若不相同则允许加入,相同则拒绝加入。
而判断的依据就是通过元素类中的hasCode函数和equals函数。
所以当我们想要用Set对自定义类去重时,要重写这两个函数。
equals()
@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()
@Override
public int hashCode() {
return (int) a;
}
返回值为int型的函数,主要用来在散列存储结构中确定对象的位置。
当我们用Set去重的时候,如果对每个元素都要进行一次相等比较,开销非常大,所以在集合要添加新的对象时,先调用这个对象的hashCode方法,得到对应的hashcode值,如果之前没有出现过改hashcode值,它就可以直接存进去,不用再进行任何比较了;如果存在该hashcode值, 就调用它的equals方法与新元素进行比较。
我觉得hasCode是对于数据做了一个预处理,帮助减少equals的使用次数,如果两个对象的hasCode值都不同,那么元素本身肯定也不相同
记住,equals判断相等,hasCode判断不相等
蓝桥杯真题 平面切分(Set自定义去重)的更多相关文章
- 【蓝桥杯真题】地宫取宝(搜索->记忆化搜索详解)
链接 [蓝桥杯][2014年第五届真题]地宫取宝 题目描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被 ...
- Java实现 LeetCode 887 鸡蛋掉落(动态规划,谷歌面试题,蓝桥杯真题)
887. 鸡蛋掉落 你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N 共有 N 层楼的建筑. 每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去. 你知道存在楼层 F ,满足 0 < ...
- bfs记录路径,蓝桥杯真题
题意:在01矩阵中,找到一条从入口到终点的最短路径,并且打印这条路径. 题目链接:http://lx.lanqiao.cn/problem.page?gpid=T291 #include<ios ...
- 蓝桥杯vip题阶乘计算
蓝桥杯vip题阶乘计算 详细题目 输入一个正整数n,输出n!的值. 其中n!=123*-*n. 算法描述 n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法.使用一个数组A来表示一个 ...
- Java实现UVA10131越大越聪明(蓝桥杯每周一题)
10131越大越聪明(蓝桥杯每周一题) [问题描述] 一些人认为,大象的体型越大,脑子越聪明.为了反驳这一错误观点,你想要分析一组大象的数据,找出尽量 多的大象组成一个体重严格递增但 IQ 严格递减的 ...
- 取球游戏_nyoj_518(博弈-蓝桥杯原题).java
取球游戏 时间限制: 1000 ms | 内存限制: 65535 KB 难度: 2 描述 今盒子里有n个小球,A.B两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下 ...
- java算法 蓝桥杯(题+答案) 方格填数
6.方格填数 (结果填空) 如下的10个格子 (如果显示有问题,也可以参看[图1.jpg]) 填入0~9的数字.要求:连续的两个数字不能相邻.(左右.上下.对角都算相邻) 一共有多少种可能的填数方案 ...
- 2019第十届蓝桥杯 E题 迷宫
/*输入 30 50 01010101001011001001010110010110100100001000101010 00001000100000101010010000100000001001 ...
- java算法 蓝桥杯(题+答案) 压缩变换
10.压缩变换 (程序设计) 小明最近在研究压缩算法.他知道,压缩的时候如果能够使得数值很小,就能通过熵编码得到较高的压缩比.然而,要使数值很小是一个挑战. 最近,小明需要压缩一些正整数的序列,这些 ...
- 蓝桥杯九宫重排(bfs+用set去重)
题目连接 #define _CRT_SECURE_NO_WARNINGS #include<cstdio> #include<iostream> #include<que ...
随机推荐
- Spring--AOP切入点表达式
AOP工作流程 能够与做代理的那个类匹配得上的话,叫做代理对象,否则为原始对象. (SpringAOP的本质:代理模式) AOP的切入点表达式 切入点表达式描述的标准格式 描述方式一:定位到某某包下的 ...
- 在golang中如何正确判断接口是否为nil
本文主要来分析一下在golang中,如何判断interface是否为nil,以及相关注意事项. 正常情况下,我们声明一个interface类型的变量,默认值将会返回nil,以golang自带的io.W ...
- 一个.Net Core开源缓存中间件,让你更加简单、方便使用缓存
上次给大家推荐过一个缓存中间件<一个C#开发的非常实用的缓存中间件>,今天再给大家推荐一个缓存中间件,两者功能差不多,都是提供统一接口.多级缓存.分布式缓存.支持多种Provider等. ...
- Stream 未释放系统资源问题处理
Unreleased Resource: Streams Abstract 程序可能无法成功释放某一项系统资源. Explanation 程序可能无法成功释放某一项系统资源. 资源泄露至少有两种常见的 ...
- python创建线程传参误区记录
创建线程可以使用threading模块中的Thread子类: 其中Thread子类允许的参数如下: (self, group=None, target=None, name=None, args=() ...
- 使用chatgt(GPT-4)将过程式(的java代码)改成函数式(的elixir代码)
天啦噜太可怕了,之前我还嘲笑chatgpt不会小众语言来着. chatgt(GPT-4)在接收2次prompt后,把过程式(的java代码)改成了函数式(的elixir代码),给出的Elixir代码可 ...
- TiDB SQL调优案例之避免TiFlash帮倒忙
背景 早上收到某系统的告警tidb节点挂掉无法访问,情况十万火急.登录中控机查了一下display信息,4个TiDB.Prometheus.Grafana全挂了,某台机器hang死无法连接,经过快速重 ...
- 在 Vue 中控制表单输入
Vue中v-model的思路很简单.定义一个可响应式的text(通常是一个ref),然后用v-model="text"将这个值绑定到一个input上.这就创造了一个双向的数据流: ...
- 19.13备库duplicate恢复新主库(二)
问题描述:主备两个库不在同一个机房,此时想从这一套库中在复制一套可读可写的新库出来.网络带宽要求比较高,需要从备库中使用备份在起一个新库,也要测试下使用duplicate从备库能够在复制一个新库.经过 ...
- lnmp中遇到open_basedir配置无效问题
在使用LNMP包安装PHP时,发现直接修改php.ini的配置是无法生效的,其原因竟然是因为nginx的配置文件,覆盖了php.ini的配置. ----------------------– LN ...