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.はじめに
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.最後に
割り算はできるだけ避ける方向でいきたいですね。