Как оптимизировать данный код по памяти?
Проблема: код работает, но превышает лимита памяти (Ограничение памяти 64МБ).
Выходные данные (ожидаются в стандартном потоке вывода) - одно целое число.
Пример 1:
Ввод:
4 6
199
453
220
601
Вывод:
200
Пример 2
Ввод:
2 100
99
1
Вывод:
1
Пример 3
Ввод:
2 100
98
1
Вывод:
0
class Main {
public static void main(String[] args) {
long pays = 0L; // максимальное количество выплаты на одного менеджера
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]);
long[] acc = new long[n]; // создаем массив для хранения значения каждого корпоративного счета
long summa = 0L; // общая сумма со всех счетов
for (int i = 0; i < acc.length; i++) { // считываем все счета и помещаем их в массив плюс находим общую сумму на всех счетах
acc[i] = Long.parseLong(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; // узнаем скольким менеджерам хватит выплатить указанное в pays количество денег
}
if(g >= m)
break; // если всем менеджерам хватает данной выплаты то завершаем программу
else
pays--; // если не всем менеджерам хватает выплаты то сумму выплат уменьшаем на единицу
}
}
} catch (Exception ex) {}
finally {
System.out.println(pays); // выводим результат
}
}
}
P.s Описание задачи:
У Петра Васильевича открыто N корпоративных счетов, на которых лежат разные суммы денег Cn, а в компании работает M менеджеров. Необходимо выяснить максимальный размер премии, которую можно отправить с учетом условий. Если денег на счетах компании не хватит на то, чтобы выдать премию хотя бы по 1 у.е. - значит премии не будет, и нужно вывести 0. Входные данные (поступают в стандартный поток ввода) Первая строка - целые числа N и M через пробел (1≤N≤100 000, 1≤M≤100 000) Далее N строк, на каждой из которых одно целое число Cn (0≤Cn≤100 000 000)
Ответы (1 шт):
Память уходит сюда:
long[] acc = new long[n];
А надо по идее:
int[] acc = new int[n];
long summa; сохранить - это разумно.
Update
Можно попробовать дальше оптимизировать по памяти, предполагая, что у Петра Васильевича много счетов с нулевым балансом. Тогда надо применить коллекцию SparseArray (разряженный массив) - он отсутствует в стандартной реализации JDK, но есть в разных сторонних либах - гугл в помощь.