第十二届蓝桥杯省赛javaB组第3题
这道题比赛的话我大概率做不出来。
涉及到直线问题我们需要考虑斜率和截距:
直线:
y
=
k
x
+
b
y = kx+b
y=kx+b,
k
k
k 是斜率,
b
b
b 是截距,我们可以用一个类来存斜率和截距。
第一步:在给定范围内,任意两个点之间构成一条直线
第二步:求出非重边的条数
需要注意的点:
① 因为斜率可能是小数,所以要用浮点型数据进行比较,对于
d
o
u
b
l
e
?
a
,
b
double\ a,b
double?a,b ,如果
∣
a
?
b
∣
≤
1
e
?
8
|a-b|\leq1e^{-8}
∣a?b∣≤1e?8 则
a
,
b
a,b
a,b 相等。
② 非重边:斜率或者截距不相等
③ 因为垂直于x轴的直线有20条,斜率和截距都相等,因此最后统计非重边条数的时候要+20
import java.util.Arrays;
public class Main {
static final int N = 200010;
static Line[] line = new Line[N];
static int n;
public static void main(String[] args) {
for (int x1 = 0; x1 <= 19; x1++) {
for (int y1 = 0; y1 <= 20; y1++) {
for (int x2 = 0; x2 <= 19; x2++) {
for (int y2 = 0; y2 <= 20; y2++) {
if (x1 != x2) {
double k = (double) (y2 - y1) / (x2 - x1);
double b = k * x1 - y1;
line[n++] = new Line(k, b);
}
}
}
}
}
Arrays.sort(line, 0, n);
int res = 1;
for (int i = 1; i < n; i++) {
if (Math.abs(line[i].k - line[i - 1].k) > 1e-8 || Math.abs(line[i].b - line[i - 1].b) > 1e-8) {
res++;
}
}
System.out.println(res + 20);
}
static class Line implements Comparable<Line> {
double k;
double b;
public Line(double k, double b) {
this.k = k;
this.b = b;
}
@Override
public int compareTo(Line o) {
if (this.k > o.k) return 1;
if (this.k == o.k) {
if (this.b > o.b) return 1;
return -1;
}
return -1;
}
}
}
|