Попытался недавно переписать задачу с C++ на Java. Собственно задача вот. Использовал BufferedReader, вот код
public static void main(String[] args) {
try(
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(new BufferedOutputStream(System.out));
) {
int k, t, p = 0;
k = Integer.parseInt(in.readLine());
for (int i = 0; i < k; i++) {
t = Integer.parseInt(in.readLine());
p ^= g(t);
}
if (p != 0) out.println("Rybka"); else out.println("Watson");
} catch(IOException e) {}
}
Получил ML, каждая строка во входной последовательности добавляет к использумой памяти примерно 160 кб. Но где там может быть утечка памяти? Посоветуйте кто может, пожалуйста, как от этого избавиться.
Вы приложили не тот код и неправильно описали свой вердикт: у Вас RE, а не MLE.
А так, проблема тут не в утечке памяти, а в кривых тестах. Вот такой код получает AC, а если заменить
long a
наint a
, то это уже RE на 47 и 48 тестах.Еще: на е-олимпе, насколько мне известно, все лимиты умножаются на 1.3 для Java и C#.
Не понимаю еще, откуда Вы взяли инфу про 160КБ на одну строчку входных данных. Их же по условию может быть миллион.
P.S. В Java можно с помощью
System.gc()
информировать сборщик мусора о том, что "пора бы, наконец, поработать".Признаю, выводы сделал сам: RE получал только в случаях, когда использование памяти выходило за 16 мб. Как только ограничивал количество считываемых строк первой тысячей, то получал результат меньше 16мб. Правда просчитался — там не 160 уж точно, а на порядок ниже.
Впрочем не страшно, если мои выводы оказались глупыми, на Java раньше задачи не писал.
Но это нормально, когда потребление памяти в разы больше, чем у решений на C++?
Да, для Java это нормально: везде объекты и автоматическая сборка мусора, причём память обычно не освобождается, пока не "очень-очень надо".
Спасибо за ссылку, будем разбираться и привыкать.