Получение ошибки во время выполнения против судьи онлайн-программирования

Итак, вот мой код для задачи 3n+1 на UVa. Он отлично работает на моем компьютере в Eclipse AFAIK, однако, я продолжаю получать ошибку времени выполнения против судьи UVa. К сожалению, судья не сообщает мне, какие входные данные он использует, и не предоставляет никакой информации, кроме "RuntimeException", в случае сбоя. Это та же самая структура, что и ICPC ACM, для любопытных.

Я почти уверен, что рекурсия не должна переполнять стек, поскольку максимальная длина цикла всех чисел от 1 до 1000000 составляет всего 525. Кроме того, кэш из 1000000 целых чисел должен иметь размер только 4 МБ.

package Collatz;

import java.util.Arrays;
import java.util.Scanner;

class Main{
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int[] cache = buildCache(1000000);
        while (in.hasNextLine()) {
            Scanner line = new Scanner(in.nextLine());
            if (!line.hasNextInt()) continue;
            int a = line.nextInt();
            int b = line.nextInt();
            int c = a;
            int d = b;
            if (c > d) {
                int temp = c;
                c = d;
                d = temp;
            }
            int max = 0;
            for (int i = c - 1; i <= d - 1; i++) {
                max = Math.max(max, cache[i]);
            }
            System.out.format("%d %d %d\n", a, b, max);
            line.close();
        }
        in.close();
    }

    public static int[] buildCache(int n) {
        int[] cache = new int[n];
        Arrays.fill(cache, 0);
        cache[0] = 1;
        for (int i = 1; i < n; i++) {
            search(i + 1, cache);
        }
        return cache;
    }

    public static int search(long i, int[] cache) {
        int n = cache.length;
        if (i == 1) {
            return 1;
        } else if (i <= n && cache[(int)(i - 1)] > 0) {
            return cache[(int)(i - 1)];
        } else {
            long j = (i % 2 == 1) ? (3 * i + 1) : (i / 2);
            int result = search(j, cache) + 1;
            if (i <= n) {
                cache[(int)(i - 1)] = result;
            }
            return result;
        }
    }
}

2 ответа

Решение

ХОРОШО. Я наконец нашел проблему. Это пакетное заявление. Программа принимается после удаления... Немного ошибка для меня, когда копируй-вставляй код из моей IDE в форму отправки. Но здесь есть несколько интересных дискуссий и спасибо всем!

Логика здесь переполнит стек. Идет поиск следующего числа в последовательности перед кэшированием результата функции на текущем.

    int result = search(j, cache) + 1;
    if (i <= n) {
        cache[(int)(i - 1)] = result;
    }
    return result;
Другие вопросы по тегам