The 20th CSP Certification-202009-Java-Check Point Query (100 puntos)

Consulta de punto de control

Límite de tiempo: 1.0 segundo
Límite de espacio: 512 MiB

Antecedentes del tema
    El 8 de junio de 2020, el Mecanismo Conjunto de Prevención y Control del Consejo de Estado emitió las "Opiniones de implementación sobre la aceleración del avance de las pruebas de ácidos nucleicos para el nuevo coronavirus", proponiendo que ocho tipos de poblaciones clave, incluidos los "contactos cercanos", deben ser "revisados" y otros grupos "dispuestos a ser controlados". Hacer inspección ".

Descripción del Título
    Hay n puntos de detección de ácido nucleico en una ciudad, numerados de 1 an, donde la posición del punto de detección i se puede expresar como una coordenada entera plana (x i , y i ). Para concertar una cita para la prueba de ácido nucleico, verifique los tres puntos de prueba más cercanos según la ubicación (X, Y) del ciudadano. Cuando varios puntos de detección tienen la misma distancia, el número más pequeño se considera más cercano.

Formato de entrada
    Leer datos de entrada estándar.

    Ingrese un total de n + 1 líneas.

    La primera línea contiene tres números enteros n, X e Y separados por espacios, lo que indica el número total de puntos de detección y la ubicación de los ciudadanos.

    Ingrese las coordenadas de n puntos de detección en secuencia desde la segunda línea hasta la línea n + 1. La línea i + 1th (1≤i≤n) contiene dos números enteros x i y y i separados por espacios , lo que indica la ubicación del punto de detección i.

Formato de salida
    Salida a salida estándar.

    Se emiten un total de tres líneas y los números de los tres puntos de detección más cercanos al ciudadano se emiten sucesivamente de cerca a lejos.

Entrada de muestra 1

3 2 2
2 2
2 3
2 4

Salida de muestra 1

1
2
3

Entrada de muestra 2

5 0 1
-1 0
0 0
1 0
0 2
-1 2

Salida de muestra 2

2
4
1

Ejemplo 2 explicación

Subtareas
    Todos los puntos de prueba cumplen, 3≤n≤200, todas las coordenadas son números enteros y el valor absoluto no excede 1000.

rápido
    La distancia Di desde el ciudadano hasta el i-ésimo punto de detección se puede calcular mediante la siguiente fórmula:
Inserte la descripción de la imagen aquí

Durante el examen casi me olvido de ordenar los comparadores, parece que la base no está bien sacudida.

Uso comparable (clasificación natural) y comparador (comparador) (Java)

Código de 100 puntos:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.StringTokenizer;

class Reader {
    
    
	static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
	static StringTokenizer tokenizer = new StringTokenizer("");

	static String next() throws IOException {
    
    
		while (!tokenizer.hasMoreTokens()) {
    
    
			tokenizer = new StringTokenizer(reader.readLine());
		}
		return tokenizer.nextToken();
	}

	static String nextLine() throws IOException {
    
    
		return reader.readLine();
	}

	static int nextInt() throws IOException {
    
    
		return Integer.parseInt(next());
	}

	static long nextLong() throws IOException {
    
    
		return Long.parseLong(next());
	}

	static double nextDouble() throws IOException {
    
    
		return Double.parseDouble(next());
	}
}

class Pair {
    
    
	int num;
	double dis;

	public Pair(double dis, int num) {
    
    
		this.dis = dis;
		this.num = num;
	}
}

class Main {
    
    

	public static void main(String[] args) {
    
    
		try {
    
    
			int n = Reader.nextInt(), X = Reader.nextInt(), Y = Reader.nextInt(), x, y;
			double dis = 0;
			ArrayList<Pair> list = new ArrayList<Pair>();
			for (int i = 0; i < n; i++) {
    
    
				x = Reader.nextInt();
				y = Reader.nextInt();
				dis = Math.sqrt((X - x) * (X - x) + (Y - y) * (Y - y));
				list.add(new Pair(dis, i + 1));
			}
			list.sort(new Comparator<Pair>() {
    
    
				public int compare(Pair o1, Pair o2) {
    
    
					if (o1.dis == o2.dis) {
    
    
						if (o1.num < o2.num) {
    
    
							return -1;
						} else if (o1.num > o2.num) {
    
    
							return 1;
						} else {
    
    
							return 0;
						}
					} else {
    
    
						if (o1.dis < o2.dis) {
    
    
							return -1;
						} else if (o1.dis > o2.dis) {
    
    
							return 1;
						} else {
    
    
							return 0;
						}
					}
				}
			});
			for (int i = 0; i < 3; i++) {
    
    
				System.out.println(list.get(i).num);
			}
		} catch (IOException e) {
    
    
			e.printStackTrace();
		}
	}
}

Supongo que te gusta

Origin blog.csdn.net/H_X_P_/article/details/108573853
Recomendado
Clasificación