Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 6. {\bf Подотрезок с заданной суммой}\\
- \textit{SOLUTION}\\
- Воспользуемся методом двух указателей. \\
- Для каждого left ищем первое $ right : \sum a_{left} ... a_{right} \ge S $
- Если получившаяся сумма нам подходит, то победа. Если нет, то сдвигаем левую границу и для нее ищем новую right.
- Ниже привожу примерный код для реализации идеи.
- \begin{code}
- int sum = 0;
- int right = 0;
- for (int left = 0; left < n; left++) {
- while (sum < S)
- sum += array[right++];
- if (sum == S)
- pobeda;
- sum -= array[left];
- }
- \end{code}
- \textit{Соображения насчет корректности}\\
- Пусть S представим в виде суммы нескольких последовательных элементов в массиве, то есть $ \exists left,right : \sum a_{left} ... a_{right} = S$\\
- По алгоритму мы перебираем все left, поэтому дойдем и до left из ответа. \\
- Для этого конкретного left по алгоритму мы найдем и первый right: $ \sum a_{left} ... a_{right} \ge S $ \\
- Таким образом, какими бы ни былы left, right из ответа, по алгоритму мы их найдем.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement