Submission #1148116

#TimeUsernameProblemLanguageResultExecution timeMemory
1148116lucianaftCoin Collecting (JOI19_ho_t4)Java
0 / 100
79 ms13124 KiB
import java.util.Scanner;

public class joi2019_ho_t4 {
  
  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in); 
    int numberOfRows = scanner.nextInt(); 
    long[][] coinCoordinates = new long[2 * numberOfRows][2]; 

    for (int index = 0; index < 2 * numberOfRows; index++) {
      coinCoordinates[index][0] = scanner.nextLong(); 
      coinCoordinates[index][1] = scanner.nextLong(); 
    }

    System.out.println(calculateMinimumMoves(numberOfRows, coinCoordinates)); 
    scanner.close(); 
  }
  
  public static long calculateMinimumMoves(int numberOfRows, long[][] coinCoordinates) {
    Position[] coinPositions = new Position[2 * numberOfRows]; 
    Position[] targetPositions = new Position[2 * numberOfRows]; 

    for (int index = 0; index < 2 * numberOfRows; index++) {
      coinPositions[index] = new Position(coinCoordinates[index][0], coinCoordinates[index][1]); 
    }

    int targetIndex = 0; 
    for (int row = 1; row <= numberOfRows; row++) {
      targetPositions[targetIndex++] = new Position(row, 1); 
      targetPositions[targetIndex++] = new Position(row, 2); 
    }

    boolean[] isTargetUsed = new boolean[2 * numberOfRows]; 
    long totalDistance = 0; 

    for (int coinIndex = 0; coinIndex < 2 * numberOfRows; coinIndex++) {
      long minimumDistance = Long.MAX_VALUE;
      int optimalTargetIndex = -1; 

      for (int targetIndexInner = 0; targetIndexInner < 2 * numberOfRows; targetIndexInner++) {
        if (!isTargetUsed[targetIndexInner]) { 
          long currentDistance = calculateManhattanDistance(coinPositions[coinIndex], targetPositions[targetIndexInner]); 
          if (currentDistance < minimumDistance) { 
            minimumDistance = currentDistance; 
            optimalTargetIndex = targetIndexInner; 
          }
        }
      }

      isTargetUsed[optimalTargetIndex] = true; 
      totalDistance += minimumDistance; 
    }

    return totalDistance; 
  }
  
  public static long calculateManhattanDistance(Position from, Position to) {
    return Math.abs(from.x - to.x) + Math.abs(from.y - to.y); 
  }

  static class Position {
    long x;
    long y;

    Position(long x, long y) {
      this.x = x;
      this.y = y;
    }
  }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...