「蓝桥杯」直线(Java)
第十二届蓝桥杯省赛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); // 最后要加上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; } }}