Submission #1148004

#TimeUsernameProblemLanguageResultExecution timeMemory
1148004abelCoin Collecting (JOI19_ho_t4)Java
Compilation error
0 ms0 KiB
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public Main {
    static int totalCoins;
    static final long INF = (long) 1e18;

    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        totalCoins = Integer.parseInt(reader.readLine().trim());

        List<int[]> positions = new ArrayList<>();

        for (int i = 0; i < 2 * totalCoins; i++) {
            String[] input = reader.readLine().trim().split(" ");
            positions.add(new int[] {
                    Integer.parseInt(input[0]),
                    Integer.parseInt(input[1])
            });
        }

        if (totalCoins <= 20) {
            System.out.println(dpMemoization(positions));
        } else {
            greedyCount(positions);
        }
    }

    static long dpMemoization(List<int[]> positions) {
        Map<String, Long> memo = new HashMap<>();
        return dpHelper(positions, new boolean[2 * totalCoins], 1, memo);
    }

    static long dpHelper(List<int[]> positions, boolean[] used, int placedCoins, Map<String, Long> memo) {
        if (placedCoins > 2 * totalCoins) {
            return 0;
        }

        String key = generateKey(used, placedCoins);
        if (memo.containsKey(key)) {
            return memo.get(key);
        }

        long minCost = INF;

        for (int i = 0; i < 2 * totalCoins; i++) {
            if (!used[i]) {
                used[i] = true;
                int[] coinPosition = positions.get(i);
                long moveCost;

                if (placedCoins > totalCoins) {
                    moveCost = Math.abs(coinPosition[0] - (placedCoins - totalCoins))
                            + Math.abs(coinPosition[1] - 2);
                } else {
                    moveCost = Math.abs(coinPosition[0] - placedCoins)
                            + Math.abs(coinPosition[1] - 1);
                }

                long totalCost = moveCost + dpHelper(positions, used, placedCoins + 1, memo);
                minCost = Math.min(minCost, totalCost);
                used[i] = false;
            }
        }

        memo.put(key, minCost);
        return minCost;
    }

    static String generateKey(boolean[] used, int placedCoins) {
        StringBuilder sb = new StringBuilder();
        for (boolean b : used) {
            sb.append(b ? '1' : '0');
        }
        sb.append(placedCoins);
        return sb.toString();
    }

    static void greedyCount(List<int[]> positions) {
        int[][] targetCounts = new int[totalCoins + 1][2];
        long movesCount = 0;

        for (int[] coinPosition : positions) {
            int x = coinPosition[0], y = coinPosition[1];

            if (x < 1) {
                movesCount += (1 - x);
                x = 1;
            } else if (x > totalCoins) {
                movesCount += (x - totalCoins);
                x = totalCoins;
            }
            if (y < 1) {
                movesCount += (1 - y);
                y = 1;
            } else if (y > 2) {
                movesCount += (y - 2);
                y = 2;
            }

            targetCounts[x][y - 1]++;
        }

        for (int i = 1; i <= totalCoins; i++) {
            targetCounts[i][0] += targetCounts[i - 1][0] - 1;
            targetCounts[i][1] += targetCounts[i - 1][1] - 1;

            if (targetCounts[i][0] > 0 && targetCounts[i][1] < 0) {
                int movesNeeded = Math.min(targetCounts[i][0], -targetCounts[i][1]);
                movesCount += movesNeeded;
                targetCounts[i][0] -= movesNeeded;
                targetCounts[i][1] += movesNeeded;
            }
            movesCount += Math.abs(targetCounts[i][0]) + Math.abs(targetCounts[i][1]);
        }
        System.out.println(movesCount);
    }
}

Compilation message (stderr)

joi2019_ho_t4.java:9: error: class, interface, enum, or record expected
public Main {
       ^
joi2019_ho_t4.java:11: error: class, interface, enum, or record expected
    static final long INF = (long) 1e18;
                 ^
joi2019_ho_t4.java:13: error: class, interface, enum, or record expected
    public static void main(String[] args) throws IOException {
                  ^
joi2019_ho_t4.java:15: error: class, interface, enum, or record expected
        totalCoins = Integer.parseInt(reader.readLine().trim());
        ^
joi2019_ho_t4.java:17: error: class, interface, enum, or record expected
        List<int[]> positions = new ArrayList<>();
        ^
joi2019_ho_t4.java:19: error: class, interface, enum, or record expected
        for (int i = 0; i < 2 * totalCoins; i++) {
        ^
joi2019_ho_t4.java:19: error: class, interface, enum, or record expected
        for (int i = 0; i < 2 * totalCoins; i++) {
                        ^
joi2019_ho_t4.java:19: error: class, interface, enum, or record expected
        for (int i = 0; i < 2 * totalCoins; i++) {
                                            ^
joi2019_ho_t4.java:21: error: class, interface, enum, or record expected
            positions.add(new int[] {
            ^
joi2019_ho_t4.java:25: error: class, interface, enum, or record expected
        }
        ^
joi2019_ho_t4.java:29: error: class, interface, enum, or record expected
        } else {
        ^
joi2019_ho_t4.java:31: error: class, interface, enum, or record expected
        }
        ^
joi2019_ho_t4.java:36: error: class, interface, enum, or record expected
        return dpHelper(positions, new boolean[2 * totalCoins], 1, memo);
        ^
joi2019_ho_t4.java:37: error: class, interface, enum, or record expected
    }
    ^
joi2019_ho_t4.java:42: error: class, interface, enum, or record expected
        }
        ^
joi2019_ho_t4.java:45: error: class, interface, enum, or record expected
        if (memo.containsKey(key)) {
        ^
joi2019_ho_t4.java:47: error: class, interface, enum, or record expected
        }
        ^
joi2019_ho_t4.java:51: error: class, interface, enum, or record expected
        for (int i = 0; i < 2 * totalCoins; i++) {
        ^
joi2019_ho_t4.java:51: error: class, interface, enum, or record expected
        for (int i = 0; i < 2 * totalCoins; i++) {
                        ^
joi2019_ho_t4.java:51: error: class, interface, enum, or record expected
        for (int i = 0; i < 2 * totalCoins; i++) {
                                            ^
joi2019_ho_t4.java:54: error: class, interface, enum, or record expected
                int[] coinPosition = positions.get(i);
                ^
joi2019_ho_t4.java:55: error: class, interface, enum, or record expected
                long moveCost;
                ^
joi2019_ho_t4.java:57: error: class, interface, enum, or record expected
                if (placedCoins > totalCoins) {
                ^
joi2019_ho_t4.java:60: error: class, interface, enum, or record expected
                } else {
                ^
joi2019_ho_t4.java:63: error: class, interface, enum, or record expected
                }
                ^
joi2019_ho_t4.java:66: error: class, interface, enum, or record expected
                minCost = Math.min(minCost, totalCost);
                ^
joi2019_ho_t4.java:67: error: class, interface, enum, or record expected
                used[i] = false;
                ^
joi2019_ho_t4.java:68: error: class, interface, enum, or record expected
            }
            ^
joi2019_ho_t4.java:72: error: class, interface, enum, or record expected
        return minCost;
        ^
joi2019_ho_t4.java:73: error: class, interface, enum, or record expected
    }
    ^
joi2019_ho_t4.java:77: error: class, interface, enum, or record expected
        for (boolean b : used) {
        ^
joi2019_ho_t4.java:79: error: class, interface, enum, or record expected
        }
        ^
joi2019_ho_t4.java:81: error: class, interface, enum, or record expected
        return sb.toString();
        ^
joi2019_ho_t4.java:82: error: class, interface, enum, or record expected
    }
    ^
joi2019_ho_t4.java:86: error: class, interface, enum, or record expected
        long movesCount = 0;
        ^
joi2019_ho_t4.java:88: error: class, interface, enum, or record expected
        for (int[] coinPosition : positions) {
        ^
joi2019_ho_t4.java:91: error: class, interface, enum, or record expected
            if (x < 1) {
            ^
joi2019_ho_t4.java:93: error: class, interface, enum, or record expected
                x = 1;
                ^
joi2019_ho_t4.java:94: error: class, interface, enum, or record expected
            } else if (x > totalCoins) {
            ^
joi2019_ho_t4.java:96: error: class, interface, enum, or record expected
                x = totalCoins;
                ^
joi2019_ho_t4.java:97: error: class, interface, enum, or record expected
            }
            ^
joi2019_ho_t4.java:100: error: class, interface, enum, or record expected
                y = 1;
                ^
joi2019_ho_t4.java:101: error: class, interface, enum, or record expected
            } else if (y > 2) {
            ^
joi2019_ho_t4.java:103: error: class, interface, enum, or record expected
                y = 2;
                ^
joi2019_ho_t4.java:104: error: class, interface, enum, or record expected
            }
            ^
joi2019_ho_t4.java:107: error: class, interface, enum, or record expected
        }
        ^
joi2019_ho_t4.java:109: error: class, interface, enum, or record expected
        for (int i = 1; i <= totalCoins; i++) {
                        ^
joi2019_ho_t4.java:109: error: class, interface, enum, or record expected
        for (int i = 1; i <= totalCoins; i++) {
                                         ^
joi2019_ho_t4.java:111: error: class, interface, enum, or record expected
            targetCounts[i][1] += targetCounts[i - 1][1] - 1;
            ^
joi2019_ho_t4.java:113: error: class, interface, enum, or record expected
            if (targetCounts[i][0] > 0 && targetCounts[i][1] < 0) {
            ^
joi2019_ho_t4.java:115: error: class, interface, enum, or record expected
                movesCount += movesNeeded;
                ^
joi2019_ho_t4.java:116: error: class, interface, enum, or record expected
                targetCounts[i][0] -= movesNeeded;
                ^
joi2019_ho_t4.java:117: error: class, interface, enum, or record expected
                targetCounts[i][1] += movesNeeded;
                ^
joi2019_ho_t4.java:118: error: class, interface, enum, or record expected
            }
            ^
joi2019_ho_t4.java:120: error: class, interface, enum, or record expected
        }
        ^
joi2019_ho_t4.java:122: error: class, interface, enum, or record expected
    }
    ^
56 errors

=======