Gridland Metro HackerRank - PullRequest
       54

Gridland Metro HackerRank

1 голос
/ 05 мая 2020

Я решал этот вопрос на hackerRank. Я просмотрел весь раздел обсуждений, попробовал все предложенные тестовые примеры с ожидаемыми результатами. Я думаю, что могу сделать какую-то глупую ошибку в коде, поскольку я уверен, что продумал / рассмотрел все сценарии реализации. не могли бы вы помочь мне указать, есть ли ошибка в моем коде.

public static void main(String[] args) throws IOException {
    BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
    String strNum[] = bf.readLine().split("\\s");
    double n = Double.parseDouble(strNum[0]);
    double m = Double.parseDouble(strNum[1]);
    double k = Double.parseDouble(strNum[2]);

    Map<Double, TreeMap<Double, Double>> map = new HashMap<>();
    while (k > 0) {
        strNum = bf.readLine().split("\\s");
        double r = Double.parseDouble(strNum[0]);
        double c1 = Double.parseDouble(strNum[1]);
        double c2 = Double.parseDouble(strNum[2]);
        TreeMap<Double, Double> innerMap = map.get(r);
        if (innerMap != null) {
            Double x = innerMap.get(c1);
            if (x != null) {
                if (c2 > x) {
                    innerMap.put(c1, c2);
                }
            } else {
                innerMap.put(c1, c2);
            }
        } else {
            innerMap = new TreeMap<Double, Double>();
            innerMap.put(c1, c2);
            map.put(r, innerMap);
        }
        k--;
    }
    double count = (n - map.size()) * m;
    for (Map.Entry<Double, TreeMap<Double, Double>> e : map.entrySet()) {
        TreeMap<Double, Double> innerMap = e.getValue();
        double start = innerMap.firstKey();
        double end = innerMap.firstEntry().getValue();
        for (Map.Entry<Double, Double> e2 : innerMap.entrySet()) {
            double x = e2.getKey();
            double y = e2.getValue();
            if (y > end) {
                if (x > end) {
                    count += ((x - end) - 1);
                }
                end = y;
            }
        }
        count += (m - (end - start + 1));
    }
    System.out.println(String.format("%.0f", count));
}

24/31 тестовые примеры не работают. Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 09 мая 2020

@ fpezzini говорит о двойниках: на входе

1000000000 1000000000 1
1 1 1

ваш код печатает 1000000000000000000, а не 999999999999999999, потому что последний не может быть представлен как double.

1 голос
/ 08 мая 2020

Если ваш код читается как r,c1,c2, за которым следует r,c1,c2' с c2'<c2, он автоматически отбрасывает предыдущую дорожку.

...