Коротко про решение:
- Нужно выбрать не более M овощей с максимальной суммой цен.
- Элементарный способ: отсортировать все N цен по убыванию и суммировать первые M элементов. Если M = 0, сумма 0.
- Временная сложность: O(N²) при простой сортировке выбора (N ≤ 1000, это непроблема).
Ниже приведён пример решения на 1C:Enterprise (язык 1C). Код делится на три части: разбор входной строки цен в массив чисел, сортировка по убыванию и суммирование первых M элементов.
Пример кода (1C)
Процедура РешениеЗадачи()
// Ввод: N, M и строка с ценами, например
N = 10;
M = 7;
СтоимостиСтрока = "4,2,16,8,9,22,18,19,10,30";
Результат = МаксимальнаяВыручка(N, M, СтоимостиСтрока);
Сообщить(Результат); // Ожидаемо: 124
КонецПроцедуры
Функция МаксимальнаяВыручка(N, M, СтрокаЦен)
// Разобрать строку цен в массив чисел
Стоим = РазобратьСтрокуЧисел(СтрокаЦен);
// Корректируем M на случай, если он больше количества цен
Если M > ТЧислоСтрок(Стоим) Тогда
M = ТЧислоСтрок(Стоим);
КонецЕсли;
// Сортировка по убыванию (селектор-сортировка)
Для i = 0 По ТЧислоСтрок(Стоим) - 1 Цикл
ИндексМакс = i;
Для j = i + 1 По ТЧислоСтрок(Стоим) - 1 Цикл
Если Стоим[j] > Стоим[ИндексМакс] Тогда
ИндексМакс = j;
КонецЕсли;
КонецЦикл;
// обмен элементов
Если ИндексМакс <> i Тогда
Временная = Стоим[i];
Стоим[i] = Стоим[ИндексМакс];
Стоим[ИндексМакс] = Временная;
КонецЕсли;
КонецЦикл;
// Сумма первых M элементов
Сумма = 0;
Для k = 0 По M - 1 Цикл
Сумма = Сумма + Стоим[k];
КонецЦикл;
Возврат Сумма;
КонецФункции
Функция РазобратьСтрокуЧисел(Строка)
// Нормализация разделителей: заменяем запятые и возможные точки с запятыми на пробелы
Строка = СтрЗаменить(Строка, ",", " ");
Строка = СтрЗаменить(Строка, ";", " ");
Результат = Новый Массив();
ТекСтр = "";
ДлинаСтроки = СтрДлина(Строка);
Для i = 1 По ДлинаСтроки Цикл
Символ = СтрСред(Строка, i, 1);
Если СтрЦелое(НайтиЦифру(Символ)) Тогда
// если символ является цифрой
ТекСтр = ТекСтр + Символ;
Иначе
Если СтрДлина(ТекСтр) > 0 Тогда
Добавить(Число(ТекСтр), Результат);
ТекСтр = "";
КонецЕсли;
КонецЕсли;
КонецЦикл;
Если СтрДлина(ТекСтр) > 0 Тогда
Добавить(Число(ТекСтр), Результат);
КонецЕсли;
Возврат Результат;
КонецФункции
Замечания по синтаксису:
- В 1С:Предприятие синтаксис может зависеть от версии и конфигурации. В примере используются стандартные операции: массивы, цикл «Для ... Цикл», функции СтрЗаменить, СтрСред, СтрДлина, Число, Добавить, Новый Массив и т.д.
- Разбор строки реализован так, чтобы работать с числами, разделёнными запятыми или точками с запятой и пробелами.
- Если входные данные будут приходить в виде массива чисел, можно заменить функцию РазобратьСтрокуЧисел на прямое присваивание этого массива — это упрощает код.
Пример работы:
- Вход: N=10, M=7, СтоимостиСтрока = "4,2,16,8,9,22,18,19,10,30"
- Обработка: восемьонный массив → сортировка по убыванию → сумма первых 7 элементов → 124
- Вывод: 124
Если хотите, могу адаптировать код под конкретную версию 1С:Предприятие (например 8.3) и под ваш формат входных данных (например, ввод через форму, файл, или параметры функции).