Problem:
A : Soccer / サッカー

問題文

A国とB国の間でAIサッカーの試合をした。あなたの手元には、ある時刻にボールを持っていた選手とその位置を記録した表がある。表は N 行からなり、上から i 番目の行は次に示す要素からなる。

フレーム数 f_i

ボールを持っている選手の背番号 a_i

その選手が属するチーム t_i

その選手の位置を表す座標 x_i , y_i

フレーム数とは、ゲームの開始時刻に 0 に設定され、 1/60 秒ごとに 1 加算される整数のことである。例えば、ゲーム開始からちょうど 1.5 秒後のフレーム数は 90 である。 背番号は各チーム内の 11 人の選手に一意にふられる整数である。さらに、表中の連続する 2 つの記録において、同じチームの異なる背番号の選手がボールを持っているとき、その間に「パス」が行われたとする。記録に存在しないフレームは考慮しなくてよい。

さて、エンジニアであるあなたの仕事は、各チームの選手間で行われたパスのうち、 最も距離(ユークリッド距離)が長いものの距離と、それにかかった時間を求めることである。 距離が最長となるパスが複数ある場合は、かかった時間が最も短いものを出力せよ。

入力

入力は以下の形式で与えられる。t_i=0 のときA国、 t_i=1 のときB国を表す。

N
f_0 a_0 t_0 x_0 y_0
…
f_{N−1} a_{N−1} t_{N−1} x_{N−1} y_{N−1}

制約

入力はすべて整数である

1 \≤ N \≤ 100

0 \≤ f_i \lt f_{i+1} \≤ 324\,000

1 \≤ a_i \≤ 11

t_i = 0,1

0 \≤ x_i \≤ 120

0 \≤ y_i \≤ 90

出力

A国の最長のパスにかかった距離と時間、B国の最長のパスにかかった距離と時間を、それぞれ1行に出力せよ。時間は秒単位とし、距離、時間ともに 10^{−3} 以下の絶対誤差は許される。パスが一度も行われなかった場合はともに −1 と出力せよ。

サンプル

サンプル入力1

5
0 1 0 3 4
30 1 0 3 4
90 2 0 6 8
120 1 1 1 1
132 2 1 2 2

サンプル出力1

5.00000000 1.00000000
1.41421356 0.20000000

A国は長さ 5 のパスを 30 フレームの時刻に 60 フレーム =1 秒でし、B国は長さ √2 のパスを 120 フレームの時刻に 12 フレーム =0.2 秒でした。これらがそれぞれの最長のパスである。

サンプル入力2

2
0 1 0 0 0
10 1 1 0 0

サンプル出力2

-1 -1
-1 -1

サンプル入力3

3
0 1 0 0 0
30 2 0 1 1
40 1 0 2 2

サンプル出力3

1.4142135624 0.1666666667
-1 -1

サンプル入力4

3
0 1 0 0 0
10 2 0 1 1
40 1 0 3 3

サンプル出力4

2.8284271247 0.5000000000
-1 -1

Solution in JAVA (judge verdict: Accepted)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import static java.lang.Integer.parseInt;

/**
 * Soccer
 */
public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String line;
		String[] words;

		int N = parseInt(br.readLine());

		int f, a, t, x, y;
		int _f, _a, _t, _x, _y;

		int LA = -1, FA = -1;
		int LB = -1, FB = -1;

		words = br.readLine().split(" ");

		_f = parseInt(words[0]);
		_a = parseInt(words[1]);
		_t = parseInt(words[2]);
		_x = parseInt(words[3]);
		_y = parseInt(words[4]);

		for (int i = 1; i < N; i++) {

			words = br.readLine().split(" ");

			f = parseInt(words[0]);
			a = parseInt(words[1]);
			t = parseInt(words[2]);
			x = parseInt(words[3]);
			y = parseInt(words[4]);

			if (a != _a && t == _t) {
				int l = (x - _x) * (x - _x) + (y - _y) * (y - _y);
				if (t == 0) {
					if (l > LA) {
						LA = l;
						FA = f - _f;
					} else if (l == LA) {
						FA = Math.min(FA, f - _f);
					}
				} else {
					if (l > LB) {
						LB = l;
						FB = f - _f;
					} else if (l == LB) {
						FB = Math.min(FB, f - _f);
					}
				}
			}

			_f = f;
			_a = a;
			_t = t;
			_x = x;
			_y = y;
		}

		if (FA != -1) {
			System.out.println(Math.sqrt(LA) + " " + ((double) FA) / 60);
		} else {
			System.out.println("-1 -1");
		}

		if (FB != -1) {
			System.out.println(Math.sqrt(LB) + " " + ((double) FB) / 60);
		} else {
			System.out.println("-1 -1");
		}

	}
}