<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413632&amp;view=findpost&amp;p=3893407</guid>
        <pubDate>Sat, 29 Jul 2023 01:37:31 +0000</pubDate>
        <title>Максимальный подмассив в КОЛЬЦЕВОМ массиве</title>
        <link>https://forum.sources.ru/index.php?showtopic=413632&amp;view=findpost&amp;p=3893407</link>
        <description><![CDATA[getch: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413632&view=findpost&p=3893367'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Feldsher &#064; <time class="tag-quote__quoted-time" datetime="2023-07-27T22:45:54+03:00">27.07.23, 19:45</time></span><div class='quote '>Если случайные значения  в массиве мы должны  перебирать комбинации элементов массива, или другие решения предлагаются?</div></div><br>
Предложенное решение работает для любых массивов, где есть хотя бы один положительный элемент.]]></description>
        <author>getch</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413632&amp;view=findpost&amp;p=3893367</guid>
        <pubDate>Thu, 27 Jul 2023 19:45:54 +0000</pubDate>
        <title>Максимальный подмассив в КОЛЬЦЕВОМ массиве</title>
        <link>https://forum.sources.ru/index.php?showtopic=413632&amp;view=findpost&amp;p=3893367</link>
        <description><![CDATA[Feldsher: Если случайные значения  в массиве мы должны  перебирать комбинации элементов массива, или другие решения предлагаются?]]></description>
        <author>Feldsher</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413632&amp;view=findpost&amp;p=3893362</guid>
        <pubDate>Thu, 27 Jul 2023 15:26:28 +0000</pubDate>
        <title>Максимальный подмассив в КОЛЬЦЕВОМ массиве</title>
        <link>https://forum.sources.ru/index.php?showtopic=413632&amp;view=findpost&amp;p=3893362</link>
        <description><![CDATA[getch: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413632&view=findpost&p=3893303'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>getch &#064; <time class="tag-quote__quoted-time" datetime="2023-07-26T10:53:57+00:00">26.07.23, 10:53</time></span><div class='quote '>Интуитивно понимаю, что сложность должна быть <strong class='tag-b'>O(k*n)</strong>.</div></div><br>
Сделал.<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#define MACROS_ANS(A, B, C, D) \</div><div class="code_line">&nbsp;&nbsp;Sum##D += A; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \</div><div class="code_line">&nbsp;&nbsp;if (Sum##D C Ans##D) &nbsp; &nbsp; &nbsp; &nbsp; \</div><div class="code_line">&nbsp;&nbsp;{ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ans##D = Sum##D; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \</div><div class="code_line">&nbsp;&nbsp; &nbsp;Left##D = Pos##D + 1; &nbsp; &nbsp; &nbsp;\</div><div class="code_line">&nbsp;&nbsp; &nbsp;Right##D = B; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\</div><div class="code_line">&nbsp;&nbsp;} &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\</div><div class="code_line">&nbsp;&nbsp;else if (!(Sum##D C 0)) &nbsp; &nbsp; &nbsp;\</div><div class="code_line">&nbsp;&nbsp;{ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\</div><div class="code_line">&nbsp;&nbsp; &nbsp;Sum##D = 0; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \</div><div class="code_line">&nbsp;&nbsp; &nbsp;Pos##D = B; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">template &#60;typename T&#62;</div><div class="code_line">T GetAnsRing( const T &amp;Array[], int &amp;Left, int &amp;Right )</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;T SumMin = 0;</div><div class="code_line">&nbsp;&nbsp;T AnsMin = 0;</div><div class="code_line">&nbsp;&nbsp;int LeftMin = 0;</div><div class="code_line">&nbsp;&nbsp;int RightMin = 0;</div><div class="code_line">&nbsp;&nbsp;int PosMin = -1;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;T SumMax = 0;</div><div class="code_line">&nbsp;&nbsp;T AnsMax = 0;</div><div class="code_line">&nbsp;&nbsp;int LeftMax = 0;</div><div class="code_line">&nbsp;&nbsp;int RightMax = 0;</div><div class="code_line">&nbsp;&nbsp;int PosMax = -1;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;T SumArray = 0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;const int Size = ::ArraySize(Array);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;for (int i = 0; i &#60; Size; i++)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;const T Value = Array[i];</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;SumArray += Value;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;MACROS_ANS(Value, i, &#62;, Max)</div><div class="code_line">&nbsp;&nbsp; &nbsp;MACROS_ANS(Value, i, &#60;, Min)</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;AnsMin = SumArray - AnsMin;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;const bool Reverse = (AnsMin &#62; AnsMax);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;Left = Reverse ? (RightMin + 1) % Size : LeftMax;</div><div class="code_line">&nbsp;&nbsp;Right = Reverse ? (LeftMin + Size - 1) % Size : RightMax;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;return(Reverse ? AnsMin : AnsMax);</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">template &#60;typename T&#62;</div><div class="code_line">T CalcInterval( const T &amp;Array[], int &amp;LeftNew, int &amp;RightNew, const uchar &amp;Mask[], int &amp;i, const int &amp;Size )</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;T SumNew = 0;</div><div class="code_line">&nbsp;&nbsp;T AnsNew = 0;</div><div class="code_line">&nbsp;&nbsp;int PosNew = i - 1;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;const int End = i;</div><div class="code_line">&nbsp;&nbsp;const int PrevMask = Mask[i];</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if (PrevMask)</div><div class="code_line">&nbsp;&nbsp; &nbsp;do</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;MACROS_ANS(Array[i], i, &#60;, New)</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (++i == Size)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;i = 0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;} while ((i != End) &amp;&amp; (Mask[i] == PrevMask));</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp;do</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;MACROS_ANS(Array[i], i, &#62;, New)</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (++i == Size)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;i = 0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;} while ((i != End) &amp;&amp; (Mask[i] == PrevMask));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;LeftNew %= Size;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;return(PrevMask ? -AnsNew : AnsNew);</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">template &#60;typename T&#62;</div><div class="code_line">T Step( const T &amp;Array[], int &amp;Left, int &amp;Right, const uchar &amp;Mask[], const int From )</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;const int Size = ArraySize(Array);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;int LeftNew;</div><div class="code_line">&nbsp;&nbsp;int RightNew;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;T Ans = 0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;int Pos = From;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;do</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;const T AnsNew = CalcInterval(Array, LeftNew, RightNew, Mask, Pos, Size);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (AnsNew &#62; Ans)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Left = LeftNew;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Right = RightNew;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Ans = AnsNew;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp;} while (Pos != From);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;return(Ans);</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void IntervalReverse( uchar &amp;Mask[], const int &amp;Left, const int &amp;Right )</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;const uchar Value = (uchar)(1 - Mask[Left]);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if (Left &#60;= Right)</div><div class="code_line">&nbsp;&nbsp; &nbsp;ArrayFill(Mask, Left, Right - Left + 1, Value);</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;ArrayFill(Mask, Left, ArraySize(Mask) - Left, Value);</div><div class="code_line">&nbsp;&nbsp; &nbsp;ArrayFill(Mask, 0, Right + 1, Value);</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">template &#60;typename T&#62;</div><div class="code_line">T Solve( const T &amp;Array[], uchar &amp;Mask[], const int Amount = 1 )</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;T Ans = 0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;ArrayResize(Mask, ArraySize(Array));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if (Amount &#62; 0)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;ArrayInitialize(Mask, 0);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int Left;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int Right;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ans = GetAnsRing(Array, Left, Right);</div><div class="code_line">&nbsp;&nbsp; &nbsp;IntervalReverse(Mask, Left, Right);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;const int From = Left;</div><div class="code_line">&nbsp;&nbsp; &nbsp;T AnsAdd = 0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (int i = 1; (i &#60; Amount) &amp;&amp; (bool)(AnsAdd = Step(Array, Left, Right, Mask, From)); i++)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Ans += AnsAdd;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;IntervalReverse(Mask, Left, Right);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;ArrayInitialize(Mask, 1);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (uint i = ArraySize(Array); (bool)i--;)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Ans += Array[i];</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;return(Ans);</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">template &#60;typename T&#62;</div><div class="code_line">void PrintResult( const T &amp;Array[], const uchar &amp;Mask[] )</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;T ArrayOut[];</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;for (uint i = ArrayCopy(ArrayOut, Array); (bool)i--;)</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (!Mask[i])</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ArrayOut[i] = 0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;ArrayPrint(ArrayOut);</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void OnStart()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;int Array[] = {1, 2, 3, -5, 1, 2, 3, -10, 1, 1, 2, -20};</div><div class="code_line">&nbsp;&nbsp;uchar Mask[];</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;for (int i = 0; i &#60; 5; i++)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;Print(&quot;\nIntervals = &quot; + (string)i + &quot;, Sum = &quot; + (string)Solve(Array, Mask, i));</div><div class="code_line">&nbsp;&nbsp; &nbsp;PrintResult(Array, Mask);</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">}</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>getch</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413632&amp;view=findpost&amp;p=3893314</guid>
        <pubDate>Wed, 26 Jul 2023 13:36:18 +0000</pubDate>
        <title>Максимальный подмассив в КОЛЬЦЕВОМ массиве</title>
        <link>https://forum.sources.ru/index.php?showtopic=413632&amp;view=findpost&amp;p=3893314</link>
        <description><![CDATA[getch: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413632&view=findpost&p=3893303'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>getch &#064; <time class="tag-quote__quoted-time" datetime="2023-07-26T10:53:57+00:00">26.07.23, 10:53</time></span><div class='quote '><span class='tag-u'>В числовом (положительные и отрицательные числа) массиве нужно найти <strong class='tag-b'>k</strong> непересекающихся подмассивов, общая сумма элементов в которых максимальна.</span> Идеально, если задача будет решаться для зацикленного массива.</div></div><br>
Обнаружил, что это стандартная задача, к решению которой сводилась <a class='tag-url' href='https://codeforces.com/blog/entry/99454' target='_blank'>задача &quot;Пингвиноведение&quot;</a> со всеросса 2015.<br>
<br>
<a class='tag-url' href='https://neerc.ifmo.ru/school/archive/2014-2015/ru-olymp-roi-2015-analysis.pdf' target='_blank'>Были даны</a> такие комментарии по ней.<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '><ul class="tag-list"><li>Пусть нам необходимо выбрать в массиве k непересекающихся отрезков с максимальной суммой.</li><li>Для k = 1 необходимо найти один отрезок с максимальной суммой, это — стандартная задача.</li><li>Будем строить ответ инкрементально: пусть мы уже построили k отрезков, научимся строить k+1.</li><li>Утверждается, что выгодно либо добавить отрезок, который не пересекается ни с одним из уже выбранных, либо следует разбить один из выбранных отрезков на два, «вырезав» из него некоторый подотрезок.</li><li>Необходимо на отрезке уметь искать подотрезок с максимальной суммой, это — стандартная задача на дерево отрезков.</li><li>Так на каждом шаге есть O(k) вариантов действий, то мы уже получили решение за O(k^2+nlog n).</li><li>Для оптимизации решения следует заметить, что наши возможности слабо изменяются при перестроении ответа: у нас, возможно, добавляются три новых возможных отрезка, и удаляется один из возможных.</li><li>Таким образом, мы можем использовать PriorityQueue или Set для выбора оптимального действия на каждом шаге.</li></ul></div></div><br>
<br>
Есть даже <a class='tag-url' href='https://ideone.com/Q2l9YW' target='_blank'>исходник решения той задачи</a> с соревнований, но для меня, как не знакомого с теорией алгоритмов, темный лес, как выделить из исходника решение стандартной задачи.]]></description>
        <author>getch</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413632&amp;view=findpost&amp;p=3893303</guid>
        <pubDate>Wed, 26 Jul 2023 10:53:57 +0000</pubDate>
        <title>Максимальный подмассив в КОЛЬЦЕВОМ массиве</title>
        <link>https://forum.sources.ru/index.php?showtopic=413632&amp;view=findpost&amp;p=3893303</link>
        <description><![CDATA[getch: Здравствуйте. Следующая задача является развитием задачи, что была решена в этой ветке несколько лет назад.<br>
<br>
<span class='tag-u'>В числовом (положительные и отрицательные числа) массиве нужно найти <strong class='tag-b'>k</strong> непересекающихся подмассивов, общая сумма элементов в которых максимальна.</span> Идеально, если задача будет решаться для зацикленного массива.<br>
<br>
Выше был предложен линейный алгоритм для <strong class='tag-b'>k = 1</strong>.<br>
<br>
Интуитивно понимаю, что сложность должна быть <strong class='tag-b'>O(k*n)</strong>. Но получается громоздко, до реализации еще не допилил. Все время всплывают ситуации, которые не учел.<br>
Исходил из того, что если есть решение для <strong class='tag-b'>k</strong>, то из него линейно можно получить решение для <strong class='tag-b'>k+1</strong>.<br>
<br>
Несколько примеров того, что нужно получить.<br>
<br>
<em class='tag-i'>{1, 2, 3, -5, 1, 2, 3, -10, 1, 2, 3, -20}</em>, k = 0<br>
<em class='tag-i'>{<strong class='tag-b'><span class='tag-u'>1, 2, 3, -5, 1, 2, 3</span></strong>, -10, 1, 2, 3, -20}</em>, k = 1, SumMax = 7<br>
<em class='tag-i'>{<strong class='tag-b'><span class='tag-u'>1, 2, 3, -5, 1, 2, 3</span></strong>, -10, <strong class='tag-b'><span class='tag-u'>1, 2, 3</span></strong>, -20}</em>, k = 2, SumMax = 7 + 6<br>
<em class='tag-i'>{<strong class='tag-b'><span class='tag-u'>1, 2, 3</span></strong>, -5, <strong class='tag-b'><span class='tag-u'>1, 2, 3</span></strong>, -10, <strong class='tag-b'><span class='tag-u'>1, 2, 3</span></strong>, -20}</em>, k = 3, SumMax = 6 + 6 + 6<br>
<br>
<em class='tag-i'>{1, 2, 3, -5, 1, 2, 3, -10, 1, 1, 2, -20}</em>, k = 0<br>
<em class='tag-i'>{<strong class='tag-b'><span class='tag-u'>1, 2, 3, -5, 1, 2, 3</span></strong>, -10, 1, 1, 2, -20}</em>, k = 1, SumMax = 7<br>
<em class='tag-i'>{<strong class='tag-b'><span class='tag-u'>1, 2, 3</span></strong>, -5, <strong class='tag-b'><span class='tag-u'>1, 2, 3</span></strong>, -10, 1, 1, 2, -20}</em>, k = 2, SumMax = 6 + 6<br>
<em class='tag-i'>{<strong class='tag-b'><span class='tag-u'>1, 2, 3</span></strong>, -5, <strong class='tag-b'><span class='tag-u'>1, 2, 3</span></strong>, -10, <strong class='tag-b'><span class='tag-u'>1, 1, 2</span></strong>, -20}</em>, k = 3, SumMax = 6 + 6 + 4<br>
<br>
Просьба помочь. Возможно, уже есть известное решение.]]></description>
        <author>getch</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413632&amp;view=findpost&amp;p=3780401</guid>
        <pubDate>Tue, 09 Oct 2018 17:28:28 +0000</pubDate>
        <title>Максимальный подмассив в КОЛЬЦЕВОМ массиве</title>
        <link>https://forum.sources.ru/index.php?showtopic=413632&amp;view=findpost&amp;p=3780401</link>
        <description><![CDATA[getch: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413632&view=findpost&p=3780395'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>amk &#064; <time class="tag-quote__quoted-time" datetime="2018-10-09T16:40:48+00:00">09.10.18, 16:40</time></span><div class='quote '><div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413632&view=findpost&p=3780390'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>getch &#064; <time class="tag-quote__quoted-time" datetime="2018-10-09T13:57:38+00:00">09.10.18, 13:57</time></span><div class='quote '>Но задать ограничение на длину подмассива не выходит.</div></div> И не выйдет. Классический алгоритм не приспособлен для такого ограничения в принципе.<br>
Однако, немного подумав, можно заметить, что в задаче возможны только два типа решений:<br>
одно совпадает с линейным решением,<br>
а второе является дополнением к такой же задаче поиска, но минимального интервала.<br>
Ко второму варианту классический алгоритм приспосабливается элементарно сменой знаков значений в массиве или сменой операторов сравнения.<br>
Обе задачи можно решать в одном цикле прохода по массиву, параллельно считая сумму массива (чтобы посчитать потом дополнение).</div></div><br>
Действительно, получилось&#33;<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">// Поиск максимального отрезка в кольце</div><div class="code_line">template &#60;typename T&#62;</div><div class="code_line">T GetAnsRing( T &amp;Array[], int &amp;Left, int &amp;Right )</div><div class="code_line">{ &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp;T SumMin = 0; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp;T AnsMin = 0;</div><div class="code_line">&nbsp;&nbsp;int &nbsp; LeftMin = 0;</div><div class="code_line">&nbsp;&nbsp;int RightMin = 0;</div><div class="code_line">&nbsp;&nbsp;int &nbsp; MinusPos = -1;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;T SumMax = 0;</div><div class="code_line">&nbsp;&nbsp;T AnsMax = 0;</div><div class="code_line">&nbsp;&nbsp;int &nbsp; LeftMax = 0;</div><div class="code_line">&nbsp;&nbsp;int RightMax = 0;</div><div class="code_line">&nbsp;&nbsp;int PositivePos = -1;</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;T SumArray = 0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;const int Size = ::ArraySize(Array);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp;for (int i = 0; i &#60; Size; i++)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;SumArray += Array[i]; &nbsp; &nbsp; &nbsp; </div><div class="code_line">&nbsp;&nbsp; &nbsp;SumMax += Array[i];</div><div class="code_line">&nbsp;&nbsp; &nbsp;SumMin += Array[i];</div><div class="code_line">&nbsp;&nbsp; </div><div class="code_line">&nbsp;&nbsp; &nbsp;if (SumMax &#62; AnsMax)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;AnsMax = SumMax;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;LeftMax = MinusPos + 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;RightMax = i;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;else if (SumMax &#60; 0) &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;SumMax = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MinusPos = i;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (SumMin &#60; AnsMin)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;AnsMin = SumMin;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;LeftMin = PositivePos + 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;RightMin = i;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;else if (SumMin &#62; 0) &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;SumMin = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PositivePos = i;</div><div class="code_line">&nbsp;&nbsp; &nbsp;} &nbsp; </div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;const T AnsMax2 = SumArray - AnsMin;</div><div class="code_line">&nbsp;&nbsp;const bool Reverse = (AnsMax2 &#62; AnsMax);</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;Left = Reverse ? (RightMin + 1) % Size : LeftMax;</div><div class="code_line">&nbsp;&nbsp;Right = Reverse ? (LeftMin + Size - 1) % Size : RightMax; &nbsp; &nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;return(Reverse ? AnsMax2 : AnsMax);</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
Спасибо&#33;]]></description>
        <author>getch</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413632&amp;view=findpost&amp;p=3780395</guid>
        <pubDate>Tue, 09 Oct 2018 16:40:48 +0000</pubDate>
        <title>Максимальный подмассив в КОЛЬЦЕВОМ массиве</title>
        <link>https://forum.sources.ru/index.php?showtopic=413632&amp;view=findpost&amp;p=3780395</link>
        <description><![CDATA[amk: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413632&view=findpost&p=3780390'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>getch &#064; <time class="tag-quote__quoted-time" datetime="2018-10-09T13:57:38+00:00">09.10.18, 13:57</time></span><div class='quote '>Но задать ограничение на длину подмассива не выходит.</div></div> И не выйдет. Классический алгоритм не приспособлен для такого ограничения в принципе.<br>
Однако, немного подумав, можно заметить, что в задаче возможны только два типа решений:<br>
одно совпадает с линейным решением,<br>
а второе является дополнением к такой же задаче поиска, но минимального интервала.<br>
Ко второму варианту классический алгоритм приспосабливается элементарно сменой знаков значений в массиве или сменой операторов сравнения.<br>
Обе задачи можно решать в одном цикле прохода по массиву, параллельно считая сумму массива (чтобы посчитать потом дополнение).]]></description>
        <author>amk</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413632&amp;view=findpost&amp;p=3780394</guid>
        <pubDate>Tue, 09 Oct 2018 16:40:44 +0000</pubDate>
        <title>Максимальный подмассив в КОЛЬЦЕВОМ массиве</title>
        <link>https://forum.sources.ru/index.php?showtopic=413632&amp;view=findpost&amp;p=3780394</link>
        <description><![CDATA[Akina: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413632&view=findpost&p=3780390'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>getch &#064; <time class="tag-quote__quoted-time" datetime="2018-10-09T13:57:38+00:00">09.10.18, 13:57</time></span><div class='quote '>задать ограничение на длину подмассива не выходит</div></div><br>
В стандартный метод надо внести два измнения.<br>
Первое - накапливать суммы, начиная с любого потенциального начала последовательности.<br>
Второе - фиксировать макс. сумму для каждой последовательности, достигшей макс. длины.<br>
Правда, при этом сложность возрастёт до O(m*n), но зато элементарно в реализации.]]></description>
        <author>Akina</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413632&amp;view=findpost&amp;p=3780390</guid>
        <pubDate>Tue, 09 Oct 2018 13:57:38 +0000</pubDate>
        <title>Максимальный подмассив в КОЛЬЦЕВОМ массиве</title>
        <link>https://forum.sources.ru/index.php?showtopic=413632&amp;view=findpost&amp;p=3780390</link>
        <description><![CDATA[getch: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413632&view=findpost&p=3780388'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Akina &#064; <time class="tag-quote__quoted-time" datetime="2018-10-09T13:37:51+00:00">09.10.18, 13:37</time></span><div class='quote '>Добавляем в хвост массива его копию без последнего элемента.<br>
Устанавливаем ограничение на длину подмассива не более исходной длины массива. <br>
Решаем стандартную задачу. Сложность O(2n) = O(n).</div></div><br>
Спасибо, именно так и пытался решить сразу. Но задать ограничение на длину подмассива не выходит.<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">int Res = 0;</div><div class="code_line">int Left = -1;</div><div class="code_line">int Right = -1;</div><div class="code_line">&nbsp;</div><div class="code_line">int Sum = 0; &nbsp; &nbsp;</div><div class="code_line">int MinusPos = -1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">const int Size2 = Size &#60;&#60; 1;</div><div class="code_line">&nbsp;</div><div class="code_line">for (int i = 0; i &#60; Size2; i++)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;const int Pos = i % Size;</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;if (Pos != Left) // ограничение на длину подмассива</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;Sum += Array[Pos];</div><div class="code_line">&nbsp;&nbsp; </div><div class="code_line">&nbsp;&nbsp; &nbsp;if (Sum &#62; Res)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Res = Sum;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Left = MinusPos + 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Right = i;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; </div><div class="code_line">&nbsp;&nbsp; &nbsp;if (Sum &#60; 0)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Sum = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MinusPos = Pos;</div><div class="code_line">&nbsp;&nbsp; &nbsp;} &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp;break; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">Right %= Size;</div></ol></div></div></div></div><br>
<br>
Результат на <em class='tag-i'>{-1, <strong class='tag-b'>6, -2, -1, 1, -4, 5, -4, -1, 7</strong>}</em> - Left = 1, Right = 9, Res = 7 - сумма.<br>
<br>
Как правильно задать ограничение на длину?]]></description>
        <author>getch</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413632&amp;view=findpost&amp;p=3780388</guid>
        <pubDate>Tue, 09 Oct 2018 13:37:51 +0000</pubDate>
        <title>Максимальный подмассив в КОЛЬЦЕВОМ массиве</title>
        <link>https://forum.sources.ru/index.php?showtopic=413632&amp;view=findpost&amp;p=3780388</link>
        <description><![CDATA[Akina: Добавляем в хвост массива его копию без последнего элемента.<br>
Устанавливаем ограничение на длину подмассива не более исходной длины массива. <br>
Решаем стандартную задачу. Сложность O(2n) = O(n).<br>
<br>
Применительно к показанному примеру <br>
<br>
<em class='tag-i'>{5, -4, -1, 7, -1, 6, -2, -1, 1, -4}</em> =&gt; <em class='tag-i'>{<strong class='tag-b'>5, -4, -1, 7, -1, 6</strong>, -2, -1, 1, -4, 5, -4, -1, 7, -1, 6, -2, -1, 1}</em><br>
<em class='tag-i'>{-1, 6, -2, -1, 1, -4, 5, -4, -1, 7}</em> =&gt; <em class='tag-i'>{-1, 6, -2, -1, 1, -4, <strong class='tag-b'>5, -4, -1, 7, -1, 6</strong>, -2, -1, 1, -4, 5, -4, -1}</em><br>
<em class='tag-i'>{6, -2, -1, 1, -4, 5, -4, -1, 7, -1}</em> =&gt; <em class='tag-i'>{6, -2, -1, 1, -4, <strong class='tag-b'>5, -4, -1, 7, -1, 6</strong>, -2, -1, 1, -4, 5, -4, -1, 7}</em>]]></description>
        <author>Akina</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413632&amp;view=findpost&amp;p=3780386</guid>
        <pubDate>Tue, 09 Oct 2018 12:42:17 +0000</pubDate>
        <title>Максимальный подмассив в КОЛЬЦЕВОМ массиве</title>
        <link>https://forum.sources.ru/index.php?showtopic=413632&amp;view=findpost&amp;p=3780386</link>
        <description><![CDATA[getch: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=413632&view=findpost&p=3780385'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>MIF &#064; <time class="tag-quote__quoted-time" datetime="2018-10-09T12:28:54+00:00">09.10.18, 12:28</time></span><div class='quote '>При данных ограничениях максимальный подмассив всегда равен массиву.</div></div><br>
Максимальный подмассив будет равен массиву только в случае, если все элементы исходного массива положительны.<br>
Видимо, я плохо сформулировал. Максимальный подмассив - это подмассив с максимальной суммой элементов.<br>
Разница от классической постановки задачи - исходный массив является <strong class='tag-b'>кольцевым</strong>.]]></description>
        <author>getch</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413632&amp;view=findpost&amp;p=3780385</guid>
        <pubDate>Tue, 09 Oct 2018 12:28:54 +0000</pubDate>
        <title>Максимальный подмассив в КОЛЬЦЕВОМ массиве</title>
        <link>https://forum.sources.ru/index.php?showtopic=413632&amp;view=findpost&amp;p=3780385</link>
        <description><![CDATA[MIF: При данных ограничениях максимальный подмассив всегда равен массиву.]]></description>
        <author>MIF</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=413632&amp;view=findpost&amp;p=3780380</guid>
        <pubDate>Tue, 09 Oct 2018 11:40:50 +0000</pubDate>
        <title>Максимальный подмассив в КОЛЬЦЕВОМ массиве</title>
        <link>https://forum.sources.ru/index.php?showtopic=413632&amp;view=findpost&amp;p=3780380</link>
        <description><![CDATA[getch: Приветствую&#33;<br>
<br>
В одномерном числовом массиве нужно найти максимальный подмассив. Но в отличие от известной задачи <span class='tag-u'>нумерация элементов закольцована</span>: после последнего элемента идет первый и т.д.<br>
<br>
Примеры для самопроверки:<br>
<em class='tag-i'>{<strong class='tag-b'>5, -4, -1,  7, -1,  6</strong>, -2, -1,  1, -4}</em> выделенная искомая сумма 12.<br>
<br>
Этот же массив, только начало с другого элемента<br>
<em class='tag-i'>{<strong class='tag-b'>-1, 6</strong>, -2, -1, 1, -4, <strong class='tag-b'>5, -4, -1, 7</strong>}</em> выделенная искомая сумма 12.<br>
<br>
Снова этот же массив, но с другим началом<br>
<em class='tag-i'>{<strong class='tag-b'>6</strong>, -2, -1, 1, -4, <strong class='tag-b'>5, -4, -1, 7, -1</strong>}</em> выделенная искомая сумма 12.<br>
<br>
<br>
<a class='tag-url' href='http://e-maxx.ru/algo/maximum_average_segment' target='_blank'>Классическое решение</a> для некольцевого массива имеет O(n). Помогите найти оптимальный вариант для кольцевого случая.<br>
Спасибо&#33;]]></description>
        <author>getch</author>
        <category>Алгоритмы</category>
      </item>
	
      </channel>
      </rss>
	