<?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=217.66.156.104&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=217.66.156.104&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/217.66.156.104"/>
		<updated>2026-04-09T16:00:38Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=Opi1sumu&amp;diff=25580</id>
		<title>Opi1sumu</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=Opi1sumu&amp;diff=25580"/>
				<updated>2012-06-17T22:20:41Z</updated>
		
		<summary type="html">&lt;p&gt;217.66.156.104: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Описание задачи==&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; работ, котороые необходимо выполнить&lt;br /&gt;
в произвольном порядке на всех станках. Время выполнения каждой работы на любом станке одинаково и равно одному. &lt;br /&gt;
Для каждой работы известно время, до которого её необходимо выполнить. Необходимо успеть выполнить как можно больше работ. &lt;br /&gt;
&lt;br /&gt;
==Описание алгоритма==&lt;br /&gt;
Отсортируем работы в порядке невозрастания дедлайнов. &lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Если в оптимальном расписании можно сделать &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; работ, то можно сделать первые &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; работ.&lt;br /&gt;
|proof=Пусть в оптимальном расписании были сделаны работы &amp;lt;tex&amp;gt;i_1, i_2, \ldots, i_k&amp;lt;/tex&amp;gt;. Докажем, что существует &lt;br /&gt;
оптимальное расписание, в котором сделаны работы &amp;lt;tex&amp;gt;1, 2, \ldots, k&amp;lt;/tex&amp;gt;. Пусть работы &amp;lt;tex&amp;gt;i_1, i_2, \ldots, i_k&amp;lt;/tex&amp;gt;&lt;br /&gt;
тоже отсортированы в порядке неубывания дедлайна. Тогда &amp;lt;tex&amp;gt;d_{i1} \le d_1, d_{i2}\le d_2, \ldots, d_{ik}\le d_{k}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Тогда, если заменить во всём расписании работу &amp;lt;tex&amp;gt;i_j&amp;lt;/tex&amp;gt; на работу &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;, то она, тем более, будет выполнена.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Обозначим за ''тайм-слот t'' множество из не более, чем &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; различных чисел {{---}} &lt;br /&gt;
номера работ, которые мы хотим выполнить в момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Введем тайм-слот для каждого момента времени от &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;d_n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Каждую работу будем пытаться сделать как можно позже. Будет рассматривать работы в порядке невозрастания дедлайнов. &lt;br /&gt;
&amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ю работу попытаемся добавить в тайм-слоты с &amp;lt;tex&amp;gt;d_i - m + 1&amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt;. &lt;br /&gt;
После добавления некоторые тайм-слоты могли переполниться (тайм-слот переполнился, если в нём уже находилось&lt;br /&gt;
&amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; работ, и в него добавили &amp;lt;tex&amp;gt;m+1&amp;lt;/tex&amp;gt;-ю). &lt;br /&gt;
Для переполнившегося тайм-слота найдём найдем самый правый левее него, который ещё не переполнился и перекинем работу, &lt;br /&gt;
которой там еще нет, в него. Так как в нем меньше элементов, то, по принципу Дирихле, это можно сделать. &lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Следуя этому алгоритму, первый тайм-слот переполнится тогдаи только тогда, когда переполнилнился&lt;br /&gt;
нулевой тайм-слот.&lt;br /&gt;
|proof=?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Опираясь на это утверждение, можно найти максимальное количество работ, которое можно выполнить. Обозначим его за &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Сведем задачу построения распинания по построенным тайм-слотам к задаче о покрытии двудольного графа минимальным &lt;br /&gt;
количеством паросочетаний.&lt;br /&gt;
&lt;br /&gt;
Построим двудольный граф. В левой доле вершинам будут соответствоввать работы, в правой {{---}} времена. Соответственно, в левой доле будет &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершин, в правой {{---}} &amp;lt;tex&amp;gt;d_{max}&amp;lt;/tex&amp;gt;. Ребро между работой &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; и временем &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; будет, если работа &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; есть в тайм-слоте &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим какое-то паросочетание &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; в этом графе. Оно соответствует корректному расписанию работ на одной машине: ни одна работа не выполняется два раза, и ни в один момент времени не выполняется более одной работы.&lt;br /&gt;
&lt;br /&gt;
Тогда, если мы сможем построить множество мощности &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; такое, что каждое ребро находится хотя бы в одном из паросочетаний, то оно будет соответствовать тому, что каждая работа обработана на каждом станке, а значит, составлено корректное расписание для этих &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; работ.&lt;br /&gt;
&lt;br /&gt;
Достроим граф до регулярного степени &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;. Достраивать будем следующим образом. Каждая вершина в левой доле имеет степень &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;, так как каждая работа представлена в &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; тайм-слотах. В правой доле степень каждой вершины не больше &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;, так как в тайм-слоте не может быть больше, чем &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; работ. Значит, в левой доле не больше вершин, чем в правой.&lt;br /&gt;
Добавим в левую долю фиктивных вершин, чтобы количества вершин в левой и правой долях сравнялись. После чего просто будем добавлять ребра между вершинами, степень которых еще меньше &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для покрытия этого графа паросочетаниями воспользуемся тем фактом, что регулярный двудольный граф степени &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; можно покрыть &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; паросочетаниями. &lt;br /&gt;
Значит, этот граф можно покрывать паросочетаниями жадно: найти максимальное паросочетание, удалить его и свести задачу к меньшей. После удаления граф останется &lt;br /&gt;
регулярым, поэтому так действовать можно.&lt;/div&gt;</summary>
		<author><name>217.66.156.104</name></author>	</entry>

	</feed>