В общем, решил попробовать пройти тестирование в одну компанию, не буду называть какую. Мне прислали такую интересную задачку. Задачку эту я решил, перебрал много переменных значений, ответ получается правильный. Но их валидатор говорит что программа выполняется слишком долго(это так, если в значение N- количество счетов передавать сто тысяч счетов, проверял, 13 секунд программа работает, надо видимо за секунду чтобы работала). Мне очень интересно было бы увидеть ваш вариант решения). В конце напишу свой вариант решения.
Условия задачи:
Ограничение времени, с 1
Ограничение памяти, МБ 64
Общее число попыток отправки 15
Петр Васильевич, директор ОАО "Рога и рога", собирается раздать премию всем менеджерам компании, он добрый и честный человек, поэтому хочет соблюсти следующие условия:
премия должна быть равной для всех менеджеров
должна быть максимально возможной и целой
должна быть выдана одной транзакцией с одного счета для каждого менеджера, без использования нескольких счетов для отправки одной премии
У Петра Васильевича открыто N корпоративных счетов, на которых лежат разные суммы денег Cn, а в компании работает M менеджеров.
Необходимо выяснить максимальный размер премии, которую можно отправить с учетом условий. Если денег на счетах компании не
хватит на то, чтобы выдать премию хотя бы по 1 у.е. - значит премии не будет, и нужно вывести 0.
Входные данные (поступают в стандартный поток ввода)
Первая строка - целые числа N и M через пробел (1≤N≤100 000, 1≤M≤100 000)
Далее N строк, на каждой из которых одно целое число Cn (0≤Cn≤100 000 000)
Проверка входных данных и обработка неправильных данных на входе не нужна, тестовые данные для проверки гарантированно подходят под описание выше
Выходные данные (ожидаются в стандартном потоке вывода)
Одно целое число, максимально возможная премия
Пример 1
Ввод:
3 6
453
220
601
Вывод:
200
Пример 2
Ввод:
2 100
99
1
Вывод:
1
Пример 3
Ввод:
2 100
98
1
Вывод:
0
Мой вариант:
import java.util.Scanner;
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); // выводим результат
}
}
}