Воспользуемся методом динамического программирования.
Заметим, что ежемесячная абонентская плата для тарифа не будет совпадать ни с одной суммой, которую готовы заплатить абоненты, только в том случае, если этим тарифом никто не пользуется. Действительно, пусть это не так. Тогда рассмотрим группу абонентов, пользующуюся этим тарифом. Поднимем абонентскую плату до минимального значения суммы, которую готовы заплатить эти абоненты. При этом заработок оператора сотовой связи увеличится, и никто из абонентов не поменяет тарифного плана.
Для решения задачи отсортируем клиентов по неубыванию суммы, которую они готовы тратить на связь в месяц, и запишем эти суммы в массив A. После этого проведём последовательное вычисление элементов массива Ans[i,j], в элементе с индексами i, j которого будет храниться максимальная сумма, которую может заработать компания при обслуживании первых i клиентов и использовании ровно j тарифных планов.
Как же вычислить Ans[i,j]? Воспользуемся вышеизложенным утверждением. Для каждого 1<=l<=i попробуем подключить абонентов A[i-l+1],…,A[i] к тарифному плану, абонентская плата которого, совпадает с той суммой, которую может заплатить A[i-l+1] абонент. Т.к. абоненты отсортированы по неубыванию суммы, которую они готовы тратить на сотовую связь, то всех перечисленных абонентов устроит этот тарифный план. Остаётся выбрать максимум по всем возможным l.
При инициализация массива Ans присвоим Ans[i,j] ноль, если i=j=0, и минус бесконечность иначе.
Не стоит забывать, что не может быть двух тарифных планов с одинаковой абонентской оплатой.
После подсчёта Ans[i,j] для всех возможных i и j, максимальная сумма, которую сможет заработать оператор, следует искать среди элементов Ans[N,1],…,Ans[N,K].
Ответ можно будет восстановить, если для каждого Ans[i,j] запоминать l, для которого прибыль была максимальна. Если в ответе получилось меньше чем K тарифов, то для оставшихся можно вывести любые числа, удовлетворяющие условиям.