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: Wrong Answer)

import java.util.*;
import java.math.*;
import java.awt.geom.*;
import java.io.*;
    
    
public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int[][] f = new int[n][5];
		double AM = -1;
		double BM = -1;
		double A = -1;
		double B = -1;
		for(int i = 0; i < n; i++) 
			for(int j = 0; j < 5; j++) 
				f[i][0] = sc.nextInt();
		for(int i = 1; i < n; i++) {
			if(f[i-1][2] != f[i][2] || f[i-1][1] == f[i][1]) continue;
			double d = Math.sqrt(Math.pow(f[i][3] - f[i-1][3], 2) + Math.pow(f[i][4] - f[i-1][4], 2));
			double time = f[i][0] - f[i-1][0];
			if(f[i][2] == 0)
				if(d > AM || (d == AM && time < A)) {
					AM = d;
					A = time;
				}
			else
				if(d > BM || (d == BM && time < B)) {
					BM = d;
					B = time;
				}
		}
		if(AM == -1) System.out.println(-1 + " " + -1);
		else System.out.printf("%.9f %.9f\n",AM,A/60);
		if(BM == -1) System.out.println(-1 + " " + -1);
		else System.out.printf("%.9f %.9f\n",BM,B/60);
	}
}