Блог пользователя nulpatrol

Автор nulpatrol, 9 лет назад, По-русски

Попытался недавно переписать задачу с 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 кб. Но где там может быть утечка памяти? Посоветуйте кто может, пожалуйста, как от этого избавиться.

  • Проголосовать: нравится
  • +8
  • Проголосовать: не нравится

»
9 лет назад, # |
  Проголосовать: нравится -8 Проголосовать: не нравится

Вы приложили не тот код и неправильно описали свой вердикт: у Вас RE, а не MLE.

А так, проблема тут не в утечке памяти, а в кривых тестах. Вот такой код получает AC, а если заменить long a на int a, то это уже RE на 47 и 48 тестах.

Еще: на е-олимпе, насколько мне известно, все лимиты умножаются на 1.3 для Java и C#.

Не понимаю еще, откуда Вы взяли инфу про 160КБ на одну строчку входных данных. Их же по условию может быть миллион.

P.S. В Java можно с помощью System.gc() информировать сборщик мусора о том, что "пора бы, наконец, поработать".

  • »
    »
    9 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Признаю, выводы сделал сам: RE получал только в случаях, когда использование памяти выходило за 16 мб. Как только ограничивал количество считываемых строк первой тысячей, то получал результат меньше 16мб. Правда просчитался — там не 160 уж точно, а на порядок ниже.

    Впрочем не страшно, если мои выводы оказались глупыми, на Java раньше задачи не писал.

    Но это нормально, когда потребление памяти в разы больше, чем у решений на C++?

    • »
      »
      »
      9 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится +11 Проголосовать: не нравится

      Да, для Java это нормально: везде объекты и автоматическая сборка мусора, причём память обычно не освобождается, пока не "очень-очень надо".

      • »
        »
        »
        »
        9 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        Спасибо за ссылку, будем разбираться и привыкать.