> 文档中心 > 「蓝桥杯」直线(Java)

「蓝桥杯」直线(Java)


第十二届蓝桥杯省赛javaB组第3题

image-20220329164247808

这道题比赛的话我大概率做不出来。

涉及到直线问题我们需要考虑斜率和截距:

直线: 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} ab1e8 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; }    }}