「蓝桥杯」直线(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;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_53407527/article/details/123833189