import java.util.Scanner;
class Main {
public static void main(String[] args) {
int pays = 0;
try {
Scanner scan = new Scanner(System.in);
String str = scan.nextLine();
int n = Integer.parseInt(str.split(" ")[0]);
int m = Integer.parseInt(str.split(" ")[1]);
int[] acc = new int[n];
int summa = 0;
for (int i = 0; i < acc.length; i++) {
acc[i] = Integer.parseInt(scan.nextLine());
summa += acc[i];
}
if(summa > 0 && m > 0) pays = summa/m;
if(pays != 0) {
while(true) { // здесь занимает больше всего ресурсов
int g = 0;
for (int i = 0; i < acc.length; i++) {
g += acc[i] / pays;
}
if(g >= m) break;
else pays--;
}
}
} catch (Exception ex) {}
finally {
System.out.println(pays);
}
}
}
Runtime rt = Runtime.getRuntime();
long usedMB = (rt.totalMemory() - rt.freeMemory()) / 1024 / 1024;
System.out.printf("Usage mamory %d Mb%n", usedMB);
int n = Integer.parseInt(str.split(" ")[0]);
int m = Integer.parseInt(str.split(" ")[1]);
while(true) { // здесь занимает больше всего ресурсов
int g = 0;
for (int i = 0; i < acc.length; i++) {
g += acc[i] / pays;
}
if(g >= m) break;
else pays--;
}
if(g >= m) break;
else pays--;
из-за этих двух странных строк (логику понять не могу, если текущая взвешенная сумма станет больше указанного на старте значения то прекращяем, иначе вычитаем 1 из pays которая поделенная сумма на m, логику чисел pays и m я понять не могу) избавиться от acc не получится, (в твоем коде нет ничего жрущего оперативную память кроме этого массива) так как нужно сначала посчитать всеобщую сумму. Т.е. если приложению на вход дать 16 миллионов строк (или 8 миллионов, int там 8 или 4 байтный?) то приложение точно выйдет за лимит памяти.