제출 #1148106

#제출 시각아이디문제언어결과실행 시간메모리
1148106ferchostudioCoin Collecting (JOI19_ho_t4)Java
0 / 100
104 ms12712 KiB
import java.util.*;

public class joi2019_ho_t4 {
  static class Position {
    int x, y;

    Position(int x, int y) {
      this.x = x;
      this.y = y;
    }

    @Override
    public boolean equals(Object o) {
      if (this == o) return true;
      if (!(o instanceof Position)) return false;
      Position p = (Position) o;
      return x == p.x && y == p.y;
    }

    @Override
    public int hashCode() {
      return Objects.hash(x, y);
    }
  }

  public static int minMovesToTarget(int N, int[][] coins) {
    // Pre-calcular todos los objetivos posibles
    Position[] targets = new Position[2 * N];
    int idx = 0;
    for (int x = 1; x <= N; x++) {
      targets[idx++] = new Position(x, 1);
      targets[idx++] = new Position(x, 2);
    }

    // Convertir monedas a Position para consistencia
    Position[] coinPositions = new Position[2 * N];
    for (int i = 0; i < 2 * N; i++) {
      coinPositions[i] = new Position(coins[i][0], coins[i][1]);
    }

    // Pre-calcular todas las distancias Manhattan
    int[][] distances = new int[2 * N][2 * N];
    for (int i = 0; i < 2 * N; i++) {
      for (int j = 0; j < 2 * N; j++) {
        distances[i][j] = Math.abs(coinPositions[i].x - targets[j].x) +
            Math.abs(coinPositions[i].y - targets[j].y);
      }
    }

    // Usar un array para seguir los objetivos utilizados
    boolean[] usedTarget = new boolean[2 * N];
    int totalMoves = 0;

    // Para cada moneda, encontrar el objetivo más cercano disponible
    for (int i = 0; i < 2 * N; i++) {
      int minDist = Integer.MAX_VALUE;
      int bestTarget = -1;

      for (int j = 0; j < 2 * N; j++) {
        if (!usedTarget[j] && distances[i][j] < minDist) {
          minDist = distances[i][j];
          bestTarget = j;
        }
      }

      if (bestTarget != -1) {
        usedTarget[bestTarget] = true;
        totalMoves += minDist;
      }
    }

    return totalMoves;
  }

  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    int N = scanner.nextInt();
    int[][] coins = new int[2 * N][2];

    for (int i = 0; i < 2 * N; i++) {
      coins[i][0] = scanner.nextInt();
      coins[i][1] = scanner.nextInt();
    }

    System.out.println(minMovesToTarget(N, coins));
    scanner.close();
  }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...