Статистика решения: 10,98% участников полностью решили задачу, 65,85% набрали 0 баллов.
Решение задачи:
Рассмотрим решение задачи с использованием динамического программирования. Для наглядности, рассмотрим алгоритм на исходном примере. Представим условие задачи в виде матрицы смежности a. Элемент a[j][i] будет равняться 0 или 1, причем равенство 1 означает что, из j месяца можно «попасть» в i, то есть производительность цеха в месяце j больше производительности в месяце i, и процент брака с точностью до одной десятой процента в месяце j меньше, чем в i. Матрица a выглядит следующим образом:
| | i |
| | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
j | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
2 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 1 | 1 |
3 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
4 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
5 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
6 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
7 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
8 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
9 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
10 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
По условию задачи будет использована только правая верхняя половина матрицы, так как должна сохраняться хронологическая последовательность месяцев. Введем еще одну ключевую матрицу d. Элементом d[i][k] будет являться количество вариантов, с помощью которых можно построить последовательность длины k, заканчивающуюся в i месяце. Рассмотрим алгоритм заполнения такой матрицы. Очевидно, что первая строка будет единичной, так как из одного месяца мы можем всегда сделать последовательность длины 1, заканчивающуюся в том же самом месяце. Далее начнем заполнять вторую строку:
очевидно, что не существует последовательности длины 2, заканчивающейся в 1 месяце;
последовательность длины 2, заканчивающуюся во втором месяце можно получить одним способом, так как последовательность длины 1 идущая ранее в хронологическом порядке только 1, а также из первого месяца можно «попасть» во второй;
в третий месяц «попасть» нельзя ни из первого, ни из второго, поэтому таких последовательностей нет;
в четвертый месяц можно «попасть» из всех трех предыдущих, поэтому будет 3 таких последовательности;
и т.д.
Можно записать формулу, для вычисления d[i][k]:
Применительно к данному примеру, матрица d будет выглядеть следующим образом:
| | i – последний месяц послед-ти |
| | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
k – длина послед-ти | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
2 | | 1 | 0 | 3 | 4 | 3 | 2 | 2 | 5 | 5 |
3 | | | 0 | 1 | 4 | 1 | 0 | 0 | 5 | 5 |
4 | | | | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
5 | | | | | 0 | 0 | 0 | 0 | 0 | 0 |
6 | | | | | | 0 | 0 | 0 | 0 | 0 |
7 | | | | | | | 0 | 0 | 0 | 0 |
8 | | | | | | | | 0 | 0 | 0 |
9 | | | | | | | | | 0 | 0 |
10 | | | | | | | | | | 0 |
Для получения ответа остается найти первую ненулевую с конца строку, и сосчитать в этой строке сумму элементов. Приведенный алгоритм решает более широкую задачу – он позволяет найти не только количество вариантов с максимальным K, но и количество вариантов с любым K.
Заданы две последовательности чисел: объем продукции и процент брака. Требуется найти наибольшую подпоследовательность, в которой объем продукции растет, а процент брака падает.
Один из цехов завода производит продукцию в течение \(N\) месяцев. Начальнику цеха было поручено составить отчет о росте производительности данного цеха и об уменьшении доли некачественной продукции в процентном соотношении (точность доли процента до одного знака после запятой, например, 2/7=0.(285714) ≈ 28.6%). При этом в отчет должна войти информация как можно за большее число месяцев \(K\) (\(K\) ≤ \(N\)) работы цеха. Начальник цеха решил, что он включит в отчет данные только по тем месяцам (не обязательно взятым подряд, но обязательно в хронологическом порядке), по которым наблюдается строгий рост количества производимой продукции и строгий спад доли бракованных товаров по сравнению с данными предыдущего месяца, вошедшего в отчет. Определить, какое максимальное количество месяцев удовлетворяет этим условиям и сколько есть возможных вариантов составления отчета.
Выходные данные
Первая строка файла содержит число \(K\) - количество месяцев, по которым будет включена в отчет информация о работе цеха. Вторая строка содержит число \(P\) - количество возможных вариантов составления отчета с максимальным содержанием.