Java 用 Set<Double>
存斜率是没问题的,不会被精度问题卡掉。
但是!Java double 区分正 $0$ 和负 $0$ !!。
也就是说 +0.0
和 -0.0
是两个不同的数字,都会被存到 Set 中,因此导致莫名其妙比答案多 $1$。
解决方法也很简单,所有点计算完后,看看 Set 中是不是同时存在 +0.0
和 -0.0
,如果是的话移掉一个就行了。
这个点坑得我好苦啊!!!
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int x0 = scanner.nextInt(), y0 = scanner.nextInt();
Set<Double> set = new HashSet<>();
for (int i = 0; i < n; i++) {
int x = scanner.nextInt(), y = scanner.nextInt();
x -= x0;
y -= y0;
if (x != 0) {
set.add(1.0 * y / x);
} else {
set.add(Double.POSITIVE_INFINITY);
}
}
if (set.contains(+0.0) && set.contains(-0.0)) {
set.remove(-0.0);
}
System.out.println(set.size());
scanner.close();
}
}
不用非得去考虑精度问题,换种直线表达方法即可:$$(x1 - x2)y + (y2-y1)x + (x2 - x1)b = 0$$
麻了,看了半个小时
加个0.0就好啦,-0.0+0.0就变成正0.0了,也不会影响其他结果