ねむーの日記~AtCoderな日々~

福岡に住むプログラミング好きのブログです!

AtCoder Beginner Contest 187 B - Gentle Pairs

仕事が始まってしまいました、ねむーです。

今回はAtCoder(https://atcoder.jp/contests/abc187/tasks/abc187_b)にて開催されました、AtCoder Beginner Contest 187 B問題「B - Gentle Pairs」の問題と僕との戦闘記です。

0.はじめに

今回も、プログラミング言語C#を使用しています。

1.問題文

x y 平面上に 1 , 2 , … , N の番号が付けられた N 個の点があります。点 i は ( x i , y i ) にあり、 N 個の点の x 座標は互いに異なります。

以下の条件を満たす整数の組 ( i , j )

( i < j ) の個数を求めてください。

点 i と点 j を通る直線の傾きが − 1 以上 1 以下である。

2.制約

  • 入力は全て整数
  • 1≤N≤103
  • |x_i| ,|y_i|≤ 103
  • i≠jならば x_i≠x_j

3.入出力例

  • 入力
3
0 0
1 2
2 1
  • 出力
2

4.初見の感想

  • 傾きは2点を選ぶと一意に決まる

5.学びポイント

  • 傾き(y/x)が1以下かを判定するより、Y<Xを判定した方が早い

6.コードと簡単な解説

using System;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            int N = int.Parse(Console.ReadLine());
            int[] x= new int[N];
            int[] y= new int[N];
            for(int i=0;i<N;i++){
                String[] input = Console.ReadLine().Split(' ');
                x[i]=int.Parse(input[0]);
                y[i]=int.Parse(input[1]);
            }
            int ans=0;
            for(int i=0;i<N;i++){
                for(int j=i+1;j<N;j++){
                    if(Math.Abs(y[i]-y[j])<=Math.Abs(x[i]-x[j])){ans++;}
                }
            }
            Console.WriteLine(ans);
        }
    }
}

7.最後に

割り算はできるだけ避ける方向でいきたいですね。