山傘のプログラミング勉強日記

プログラミングに関する日記とどうでもよい雑記からなるブログです。

[AtCoder] AtCoder Beginner Contest 010 C - 浮気調査

二点間の距離に関する問題

C - 浮気調査

二次元の座標が整数で与えられているので、座標は格子点となります。

説明にある通り、二点間の距離は平方根を使う必要がありますが、評価する式を二乗することで平方根をなくすことができます。

平方根がなければ、小数点を気にしなくて良いというメリットがありますが、桁が大きくなってしまいます。

コード

import java.util.Scanner;

public class ProblemC {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int x1 = scan.nextInt();
        int y1 = scan.nextInt();
        int x2 = scan.nextInt();
        int y2 = scan.nextInt();

        int T = scan.nextInt();
        int V = scan.nextInt();

        int n = scan.nextInt();
        int L = V * T;

        boolean flag = false;
        for(int i = 0; i < n; i++) {
            int x = scan.nextInt();
            int y = scan.nextInt();
            long l1 = dist(x1, x, y1, y);
            long l2 = dist(x2, x, y2, y);
            long k = L * L - l1 - l2;
            if(4 * l1 * l2 <= k * k) {
                flag = true;
            }
        }
        scan.close();
        if(flag) {
            System.out.println("YES");
        }else {
            System.out.println("NO");
        }
    }
    public static long dist(int x1, int x2, int y1, int y2) {
        long l = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
        return l;
    }
}