<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=46.183.220.242&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=46.183.220.242&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/46.183.220.242"/>
		<updated>2026-04-12T15:01:04Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=Ppi1riintegerLmax&amp;diff=54387</id>
		<title>Ppi1riintegerLmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=Ppi1riintegerLmax&amp;diff=54387"/>
				<updated>2016-06-03T21:52:04Z</updated>
		
		<summary type="html">&lt;p&gt;46.183.220.242: алгоритм&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;tex dpi = &amp;quot;200&amp;quot;&amp;gt; P \mid p_i=1; r_i - integer \mid L_{max} &amp;lt;/tex&amp;gt;&lt;br /&gt;
{{Задача&lt;br /&gt;
|definition=&lt;br /&gt;
Дано &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; однородных станков, работающих параллельно, и &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; работ с временем выполнения &amp;lt;tex&amp;gt;p_i = 1&amp;lt;/tex&amp;gt;, временем появления &amp;lt;tex&amp;gt;r_i&amp;lt;/tex&amp;gt;, заданным целым числом, и момент времени &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt;, к которому нужно выполнить работу. Необходимо построить такое расписание, чтобы значение максимального опоздания &amp;lt;tex&amp;gt;L_{max} = \max\limits_{i=1\ldots n} (C_i - d_i)&amp;lt;/tex&amp;gt; было минимальным.&lt;br /&gt;
}}&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
=== Идея ===&lt;br /&gt;
Отсортируем все работы по времени появления в неубывающем порядке так, что &amp;lt;tex&amp;gt;r_1 \leqslant r_2 \leqslant  \ldots  \leqslant r_n&amp;lt;/tex&amp;gt;. Теперь будем выполнять доступные на данный момент работы в порядке неубывания дедлайнов &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt;. То есть, если в момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; есть свободные станки и есть невыполненные работы такие, что &amp;lt;tex&amp;gt;r_i \leqslant t&amp;lt;/tex&amp;gt;, то назначаем работу с наименьшим дедлайном &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt; на свободный станок.&lt;br /&gt;
&lt;br /&gt;
=== Псевдокод ===&lt;br /&gt;
Алгоритм принимает на вход массив пар, где первый элемент является временем появления &amp;lt;tex&amp;gt;r_i&amp;lt;/tex&amp;gt; работы, а второй её дедлайном &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt;, и возвращает расписание, представленное массивом, где на позиции &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; стоит момент обработки работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 '''function''' scheduling(jobs: '''&amp;lt;int, int&amp;gt;'''[n]) -&amp;gt; '''int[n]'''&lt;br /&gt;
     sort(jobs) &amp;lt;font color=green&amp;gt;// сортируем работы в порядке неубывания времени появления&amp;lt;/font&amp;gt;&lt;br /&gt;
     '''int''' j = 1 &amp;lt;font color=green&amp;gt;// последняя невыполненная работа&amp;lt;/font&amp;gt;&lt;br /&gt;
     '''int[n]''' ans &amp;lt;font color=green&amp;gt;// массив, куда будет записано расписание&amp;lt;/font&amp;gt;&lt;br /&gt;
     '''heap''' M &amp;lt;font color=green&amp;gt;// куча, в которой будем хранить доступные на данный момент работы в порядке неубывания дедлайнов&amp;lt;/font&amp;gt;&lt;br /&gt;
     '''while''' j &amp;lt;= n&lt;br /&gt;
         '''int''' time = jobs[j].first&lt;br /&gt;
         '''while''' jobs[j].first &amp;lt;= time &amp;lt;font color=green&amp;gt;// добавляем в кучу все невыполненные работы, доступные на данный момент&amp;lt;/font&amp;gt;&lt;br /&gt;
            M.push(j)&lt;br /&gt;
            j++&lt;br /&gt;
         &lt;br /&gt;
         '''int''' k = 0 &amp;lt;font color=green&amp;gt;// количество занятых станков в данный момент времени&amp;lt;/font&amp;gt;&lt;br /&gt;
         '''while''' M.notEmpty()&lt;br /&gt;
            i = M.pop() &amp;lt;font color=green&amp;gt;// получаем доступную работу с наименьшим дедлайном &amp;lt;/font&amp;gt;&lt;br /&gt;
            ans[i] = t &amp;lt;font color=green&amp;gt;// назначаем работу i на время t&amp;lt;/font&amp;gt;&lt;br /&gt;
            '''if''' k + 1 &amp;lt; m &amp;lt;font color=green&amp;gt;// если в момент t есть свободный станок, то назначаем работу i на него&amp;lt;/font&amp;gt;&lt;br /&gt;
                k++&lt;br /&gt;
            '''else''' &amp;lt;font color=green&amp;gt;// иначе увеличиваем время и обновляем список доступных работ&amp;lt;/font&amp;gt;&lt;br /&gt;
                t++&lt;br /&gt;
                k = 0&lt;br /&gt;
                '''while''' jobs[j].first &amp;lt;= time&lt;br /&gt;
                    M.push(j)&lt;br /&gt;
                    j++&lt;/div&gt;</summary>
		<author><name>46.183.220.242</name></author>	</entry>

	</feed>