Форум программистов, компьютерный форум CyberForum.ru

Объясните смысл задачи "3 конвейера" - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
17.09.2013, 17:37     Объясните смысл задачи "3 конвейера" #1
Никак не могу понять, что такого сложного в следующей задаче, которая в книге помечена звездочкой(т.е. является задачей повышенной сложности)
Пусть имеется 3 конвейера. Конвейеры работают независимо друг от друга. Изначально на первом конвейере располагаются детали N типов, а второй и третий - пусты. Время обработки каждого типа с каждого конвейера задается матрицей [1..N, 1..3]. После обработки с конвейера k она поступает на конвейер k+1. Назовем обработанную деталь с третьего конвейера изготовленной. Требуется по начальному расположению деталей на первом конвейере определить время, через которое все детали будут изготовлены.
Я понимаю это так: дана последовательности деталей определенного типа(массив, текстовый файл или просто ввод с клавиатуры), а также матрица времени обработки детали каждого типа на каждом конвейере. Причем пока обрабатывается одна деталь на одном конвейере, остальные детали на этом конвейере "простаивают". В таком случае задача просто элементарна! Надо просто последовательно просуммировать столбцы матрицы времени каждой детали, который расположены в определнном порядке. Может я что-то не так понял?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.09.2013, 17:37     Объясните смысл задачи "3 конвейера"
Посмотрите здесь:

C++ Необработанное исключение в "0x00412b4a" в "kursovik.exe": 0xC0000005: Нарушение прав доступа при чтении "0x00000004".
C++ Необработанное исключение в "0x01082855" в "sort.exe": 0xC0000005: Нарушение прав доступа при записи "0xcccccccc"
В чем смысл выражения "y+='A'-10" ? C++
C++ Объясните, как происходит вывод элемента из "стека", списки\структуры
Каков смысл в "куче"? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Fyret
184 / 170 / 13
Регистрация: 30.07.2013
Сообщений: 359
17.09.2013, 18:15     Объясните смысл задачи "3 конвейера" #2
Думаю. можно считать, что каждый конвейер в любой момент времени обрабатывает только одну деталь. Но пока он ее обрабатывает, 2 других могут или тоже работать, или простаивать, т.к. разные операции, разные детали... И все это еще зависит от порядка деталей. Короче, нифига не тривиально.
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
17.09.2013, 18:46  [ТС]     Объясните смысл задачи "3 конвейера" #3
Fyret, где, например, может возникнуть сложность? Можешь привести хоть один пример, отличный от банального суммирования времени изготовления детали 1, затем детали 2 и т.д.?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
17.09.2013, 18:59     Объясните смысл задачи "3 конвейера" #4
Цитата Сообщение от Buckstabue Посмотреть сообщение
затем детали 2 и т.д.?
пока деталь два делается, первая в это время проходит второй конвейер. Потом деталь с первого переходит на второй, деталь со второго переходит на третий и т.д.. Необходимо рассчитать не только время обработки деталей, но и простои конвейров в ожидании из-за различий во времени обработки каждой детали на каждом конвейере
AnyOne697
 Аватар для AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 532
17.09.2013, 19:01     Объясните смысл задачи "3 конвейера" #5
Действительно, не самая простая задача. На мой взгляд, здесь уместна будет несложная динамика. Или мат. моделирование.
Вкратце:
Момент времени Tb (begin):
Код
t3 t2 t1 -> [             ] -> [             ] -> [             ] -> .
И в момент времени Tb + 1:
Код
t3 t2     -> [ t1         ] -> [             ] -> [             ] -> .
Здесь всё понятно и просто.
Но начинается жара примерно здесь:
Код
t3         -> [ t2          ] -> [            ] -> [ t1          ] -> .
Другими словами - всё плохо, так как второй конвейр простаивает, тогда как первый и третий загружены. А время идёт.
Мат. моделирование простое, если числа дискретны (на самом деле, любые числа в компе дискретны, но...), то есть целочисленны, или можно домножить на не очень большое число и получить integer (хотя можно сделать немного магии и из любого дробного сделать int, но там компьютер может и не успеть).
Поэтому лучше использовать динамику. Как вариант - оценить время сверху и дальше поэтапно подобными же методами улучшать.
Небольшая эвристика пришла в голову, пока доказать не могу, но возможно рабочая: берём для каждой детали максимальное время обработки, и складываем их. Почему? На мой взгляд, ясно, что каждый конвейр должен обработать каждую деталь, соответственно, это и есть узкое горлышко. Правда я сейчас почему-то сильно сомневаюсь: возможно есть какие-то граничные случаи и это не есть оценка с верху. И улучшать довольно сложно.

Ещё как вариант, можно сделать три очереди - каждая очередь конвейр (ну по сути, это и есть мат. моделирование). И проталкивать детали. При этом каждый конвейр приплюсовывает себе время обработки этой детали и время ожидания (какая-нибудь умная разность между временем обработки текущей детали и детали с предыдущего конвейра, например:
Код
Tfull ( Ci, ti ) =  T ( Ci, ti ) + max ( T ( Ci-1, ti+1 ) - T ( Ci, ti ), 0 )
За правильность формулы не ручаюсь, сейчас пытался спроецировать задачу в голове. Возможна фатальная ошибка. Но даже если она внезапно-чудесным образом оказалась верна, лично мне не совсем понятно, как это программировать. Это сообщение я пишу уже где-то час. Это очень много для спортивного программирования (десяток задач на пять часов, то есть задача в пол часа - очень быстро, даже слишком).
Fyret
184 / 170 / 13
Регистрация: 30.07.2013
Сообщений: 359
17.09.2013, 19:02     Объясните смысл задачи "3 конвейера" #6
Вот простой пример: конвейеры I и II, типы деталей 1 и 2.

Матрица:
I II
1 1.0 1.1
2 1.2 0.9

На входе: 1 1 2 -> 1.0 + max(1.1, 1.0) + max(1.1, 1.2) + 0.9 = 4.2
На входе: 1 2 1 -> 1.0 + max(1.1, 1.2) + max(0.9, 1.0) + 1.1 = 4.3

Как бы уже не банальное суммирование.
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
17.09.2013, 19:17  [ТС]     Объясните смысл задачи "3 конвейера" #7
Fyret, все равно не понял. Для меня все просто. Пока деталь 1 не будет изготовлена, деталь 2 тоже ну будет изготовлена. Эти три конвейера можно объединить в один, но у которого есть три остановки, время остановки для деталей каждого типа разное, но какая к черту разница, если пока деталь одна не пройдет остановку номер один, другая деталь не станет обрабатываться. Где ошибка в моих рассуждениях?

Добавлено через 2 минуты
AnyOne697, кстати, задача реально расположена в подразделе "задачи на очередь"
AnyOne697
 Аватар для AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 532
17.09.2013, 19:29     Объясните смысл задачи "3 конвейера" #8
Цитата Сообщение от Buckstabue Посмотреть сообщение
AnyOne697, кстати, задача реально расположена в подразделе "задачи на очередь"
По этому поводу вот что могу сказать: это пример решения. Многие задачи можно решать сотней разных способов. Не удивлюсь, если можно найти матрицу, произведение которой и входной будет давать матрицу, детерминант (или более интересная характеристика) которой и будет решением. При произведении мы получим сумму произведений в каждой ячейке, что собственно и может быть какой-нибудь временной характеристикой. Но найти такое решение не так то и легко, хотя к задачи произведения матриц можно многое свести.
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
17.09.2013, 19:35  [ТС]     Объясните смысл задачи "3 конвейера" #9
AnyOne697, вообще мне это задача ооооченьь сильно напоминает задачу о поиске максимального потока в транспортной сети!
Там тоже есть такая ситуация!
Смотрите сами: пусть два конвейера с матрицей
5 5
2 2
Тут уже время изготовления всех деталей равно 10 + 0 + 2
Может кто сможет первести эту задачу на язык графов?
AnyOne697
 Аватар для AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 532
17.09.2013, 19:41     Объясните смысл задачи "3 конвейера" #10
Цитата Сообщение от Buckstabue Посмотреть сообщение
Эти три конвейера можно объединить в один, но у которого есть три остановки, время остановки для деталей каждого типа разное, но какая к черту разница, если пока деталь одна не пройдет остановку номер один, другая деталь не станет обрабатываться.
В принципе, Вы правы. Но. Требуется найти точное время, а не оценить, а это потребует скруполёзной работы с кодом. Мне тоже сначала показалось именно так. Мои рассуждения:
1) последняя деталь пройдёт - всё закончилось, значит нужно найти время, требуемое последней детали плюс, время ожидания её прихода на первый конвейер
2) время ожидания - есть сумма времён, которое требуется для прохода каждой детали, учитывая время их ожидания
3) учитывая время ожидания? А каким образом учитывать?
Примерно в таком темпе родилась последняя формула, но далеко не факт, что это правильно.

Намного проще смоделировать процесс мат. моделью и запустить её, но как долго она будет работать?

Добавлено через 3 минуты
Цитата Сообщение от Buckstabue Посмотреть сообщение
Может кто сможет первести эту задачу на язык графов?
Не думаю, что графы здесь сильно помогут. Можно, конечно, но задача будет описана неказисто и некрасиво. Форд-фалкерсон здесь не отработает - там поток один и он делиться между рёбрами, а также сливается в вершинах. Это немного не то. В этой задаче, если конвейеры - вершины, то их пропускная способоность одинакова, а поток дискретен. Получается совсем другой алгоритм, с решением, по сути, тем же, но математическое описание уродливо.
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
17.09.2013, 19:48  [ТС]     Объясните смысл задачи "3 конвейера" #11
AnyOne697, пожалуй, сделаю как вы приказали: создам три очереди и буду проталкивать по ним детали, при этом буду искать очередь с таким типом детали(вершина очереди), время которого будет меньше на данном конвейере, после чего буду вычитать из всех других конвейеров это самое время(т.е. уменьшать время изготовления текущей детали). Как вам такая идея?

Добавлено через 3 минуты
Хотя нет. Буду вычитать время только у предыдущих конвейеров, а иначе это будет бессмыслено
AnyOne697
 Аватар для AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 532
17.09.2013, 19:48     Объясните смысл задачи "3 конвейера" #12
Цитата Сообщение от Buckstabue Посмотреть сообщение
время которого будет меньше на данном конвейере, после чего буду вычитать из всех других конвейеров это самое время(т.е. уменьшать время изготовления текущей детали)
Немного не понятно. Это задача на нахождение ограничения, а не на оптимизацию. Возможно поэтому максимальный поток транспортной сети немного похожа - там также находиться максимально возможный поток. Но здесь оптимизировать нечего.
Тем более, что я не понял, из чего Вы собираетесь вычитать. Но если чувствуете, что задача почти решена, лучше не терять момент. У меня такое тоже было, и мы в команде, помню, договорились, что в такие ситуации мы спихиваем слоупока с компа и сажаем за него прозревшего, а остальные пока решают другие задачи. Так, бывало, треть задач делали. Правда, часто чувство подводило.
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
17.09.2013, 19:56  [ТС]     Объясните смысл задачи "3 конвейера" #13
Вычитать очень просто. Простейший пример:
два конвейера с матрицей
2 2
1 1
На него подаются две детали с типами 1 и 2
2 + 1 + (2-1) + 1
Т.е. пока на конвейере II изготавливается деталь номер один, в этот момент успеет изотовиться деталь номер 2 на первом конвейере, потом все же придется подождать одну секунду на конвейере два, пока до конца не обработается деталь 1, потом на конвейере II изготавливается деталь 2
AnyOne697
 Аватар для AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 532
17.09.2013, 19:58     Объясните смысл задачи "3 конвейера" #14
Цитата Сообщение от Buckstabue Посмотреть сообщение
Т.е. пока на конвейере II изготавливается деталь номер один, в этот момент успеет изотовиться деталь номер 2 на первом конвейере, потом все же придется подождать одну секунду на конвейере два, пока до конца не обработается деталь 1, потом на конвейере II изготавливается деталь 2
Похоже на правду. Но реализовывать надо аккуратно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.09.2013, 14:44     Объясните смысл задачи "3 конвейера"
Еще ссылки по теме:

Не могу понять смысл "связные списки" C++
Объясните использование "double" в данном примере C++
C++ Объясните, что означает wstring input = L""; и wstring output = L""; ?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
21.09.2013, 14:44  [ТС]     Объясните смысл задачи "3 конвейера" #15
Вот мое решение, вдруг кому пригодится. Только пришлось самому писать классы для работы со списком и очередью, т.к. преподаватель не любит, когда используются стандартные классы в лабораторных
main.cpp
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include <iostream>
#include <fstream>
#include <algorithm>
#include <climits>
 
#include "queue.h"
 
/* Задача:
  Пусть имеется 3 конвейера. Конвейеры работают независимо друг от друга.
  Изначально на первом конвейере располагаются детали N типов, а второй
  и третий - пусты. Время обработки каждого типа с каждого конвейера
  задается матрицей [1..N, 1..3]. После обработки с конвейера k она поступает
  на конвейер k+1. Назовем обработанную деталь с третьего конвейера изготовленной.
  Требуется по начальному расположению деталей на первом конвейере определить
  время, через которое все детали будут изготовлены.
*/
 
/* Формат входного файла:
   На первой строке число различных типов деталей (N)
   Дальше идет матрица времени обработки конвейеров деталей
   Дальше кол-во деталей(=detailsCount) на первом конвейере на момент начала работы
   Дальше detailsCount записей с типом очередной детали
   (тип детали в пределах от 1 до N включительно)
*/
 
/* функция проверяет, являются ли все очереди в массиве очередей пустыми.
   возвращает true, если все очереди в массиве пустые, иначе false */
template <class T>
bool allQueueIsEmpty(const Queue<T> queueArr[], int N);
 
int main()
{
    int N = 0; // кол-во типов деталей
    int detailsCount = 0; // общее число деталей
    unsigned int totalTime = 0; // время, затраченное на изготовление всех деталей
    const int CONVEYER_NUM = 3; // число конвейеров
    Queue<int> queueArr[CONVEYER_NUM]; // массив очередей для каждого конвейера
    int detailTime[CONVEYER_NUM]; // время изготовления очередной детали для каждого конвейера
    int **conveyerMatrix = NULL; // матрица времени изготовления детали каждого типа на каждом конвейере
    std::ifstream fin("input.txt");
 
    fin >> N;
 
    conveyerMatrix = new int*[N];
    for (int i = 0; i < N; ++i)
        conveyerMatrix[i] = new int[CONVEYER_NUM];
    for (int i = 0; i < N; ++i)
        for (int j = 0; j < CONVEYER_NUM; ++j)
        {
            int tmp;
 
            fin >> tmp;
            conveyerMatrix[i][j] = tmp;
        }
 
    fin >> detailsCount;
    for (int i = 0; i < detailsCount; ++i)
    {
        int curDetailType;
 
        fin >> curDetailType;
        // по умолчанию все детали помещаются в первый конвейер
        queueArr[0].push_back(curDetailType - 1);
    }
 
    totalTime = 0;
    std::fill(detailTime + 1, detailTime + CONVEYER_NUM, 0);
    detailTime[0] = conveyerMatrix[queueArr[0].front()][0];
 
    while (!allQueueIsEmpty(queueArr, CONVEYER_NUM))
    {   // пока есть хотя бы одна деталь на каком-либо конвейере.
        // минимальное время обработки текущей детали на всех непустых конвейерах
        int minTime = INT_MAX;
 
        for (int i = 0; i < CONVEYER_NUM; ++i)
        {
            if (!queueArr[i].empty() && detailTime[i] < minTime)
                minTime = detailTime[i];
        }
 
        for (int i = CONVEYER_NUM - 1; i >= 0; --i)
        {
            /* обратный обход нужен, чтобы при переходе детали на следующий
               конвейер, если он был пуст, то он не будет обрабатываться в цикле
               на следующих итерациях, т.к. был обработан ранее
             */
            if (!queueArr[i].empty())
            {
                detailTime[i] -= minTime; // вычитаем минимальное время обработки из всех непустых конвейеров
                if (!detailTime[i])
                {
                    if (i != CONVEYER_NUM - 1) // если это не последний конвейер
                    {
                        if (queueArr[i+1].empty())
                            detailTime[i+1] = conveyerMatrix[queueArr[i].front()][i+1];
                        queueArr[i + 1].push_back(queueArr[i].front());
                    }
                    queueArr[i].pop_front();
                    if (!queueArr[i].empty()) // если в конвейере после удаления остались детали
                        detailTime[i] = conveyerMatrix[queueArr[i].front()][i];
                    else
                        detailTime[i] = 0;
                }
            }
        }
 
        totalTime += minTime;
    }
 
 
    std::cout << "time: " << totalTime << std::endl;
 
 
    return 0;
}
 
template <class T>
bool allQueueIsEmpty(const Queue<T> queueArr[], int N)
{
    for (int i = 0; i < N; ++i)
        if (!queueArr[i].empty())
            return false;
    return true;
}

list.h
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
#ifndef LIST_H
#define LIST_H
 
#include <new>
 
#ifndef NULL
#define NULL 0
#endif
 
typedef unsigned int uint;
 
template <class T>
struct Node
{
    T data;
    Node<T> *next;
};
 
template <class T>
class List
{
public:
    List();
    List(const List<T>& x);
    bool push_front(const T& x);
    bool push_back(const T& x);
    bool empty() const { return list_size == 0; }
    uint size() const {return list_size; }
    T front() const { return first->data; }
    T back() const { return last->data; }
    void pop_front();
    void pop_back();
    void clear();
    bool remove(const T& value);
    bool remove(const Node<T> * const node);
    void push_front();
    virtual ~List();
    List<T>& operator=(const List<T>& x);
private:
    Node<T> *first;
    Node<T> *last;
    uint list_size;
};
 
template <class T>
List<T>::List()
{
    first = last = NULL;
    list_size = 0;
}
 
template <class T>
bool List<T>::push_back(const T& x)
{
    Node<T> *newNode = new (std::nothrow) Node<T>;
 
    if (newNode) // Если выделение памяти произошло успешно
    {
        newNode->data = x;
        newNode->next = NULL;
        if (!empty())
            last->next = newNode;
        else
            first = newNode;
        last = newNode;
        ++list_size;
 
        return true;
    }
    else
        return false;
}
 
template <class T>
bool List<T>::push_front(const T& x)
{
    Node<T> *newNode = new (std::nothrow) Node<T>;
 
    if (newNode)
    {
        newNode->data = x;
        newNode->next = first;
        if (empty())
            last = newNode;
        first = newNode;
        ++list_size;
 
        return true;
    }
    else
        return false;
}
 
template <class T>
void List<T>::pop_front()
{
    if (!empty())
    {
        Node<T> *tmp = first->next;
 
        delete first;
        --list_size;
        first = tmp;
        if (!list_size)
            last = NULL;
 
    }
}
 
template <class T>
void List<T>::pop_back()
{
    if (!empty())
    {
        Node<T> *prevLast = NULL;
 
        for (Node<T> *i = first; i != last; prevLast = i, i = i->next);
        delete last;
        --list_size;
        last = prevLast;
        if (empty())
            first = NULL;
    }
}
 
template <class T>
bool List<T>::remove(const Node<T> * const node)
{
    Node<T> *prev = NULL;
    Node<T> *i = first;
 
    for (; i != NULL && i != node; prev = i, i = i->next);
    if (i)
    {
        if (!prev)
        {
            Node<T> *tmp = first->next;
 
            delete first;
            --list_size;
            first = tmp;
            if (!list_size)
                last = NULL;
        }
        else if (i == last)
        {
            delete last;
            --list_size;
            last = prev;
            if (empty())
                first = NULL;
        }
        else
        {
            prev->next = i->next;
            delete i;
            --list_size;
        }
 
        return true;
    }
    else
        return false;
 
}
 
template <class T>
bool List<T>::remove(const T& value)
{
    Node<T> *prev = NULL;
    Node<T> *i = first;
 
    for (; i != NULL && i->data != value; prev = i, i = i->next);
    if (i)
    {
        if (!prev)
        {
            Node<T> *tmp = first->next;
 
            delete first;
            --list_size;
            first = tmp;
            if (!list_size)
                last = NULL;
        }
        else if (i == last)
        {
            delete last;
            --list_size;
            last = prev;
            if (empty())
                first = NULL;
        }
        else
        {
            prev->next = i->next;
            delete i;
            --list_size;
        }
 
        return true;
    }
    else
        return false;
 
}
 
template <class T>
List<T>::~List()
{
    clear();
}
 
template <class T>
List<T>& List<T>::operator=(const List<T>& x)
{
    clear();
 
    for (Node<T> *i = x.first; i != NULL; i = i->next)
        push_back(i->data);
 
    return *this;
}
 
template <class T>
void List<T>::clear()
{
    Node<T> *next;
 
    for (Node<T> *i = first; i != NULL; i = next)
    {
        next = i->next;
        delete i;
    }
    first = last = NULL;
    list_size = 0;
}
 
#endif // LIST_H

queue.h
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifndef QUEUE_H
#define QUEUE_H
 
#include "list.h"
 
template <class T>
class Queue
{
public:
    Queue(){}
    T front() const { return list.front(); }
    T back() const { return list.back(); }
    bool push_back(const T& x) { return list.push_back(x); }
    void pop_front() { list.pop_front(); }
    bool empty() const {return list.empty(); }
private:
    List<T> list;
};
 
#endif // QUEUE_H

input.txt(пример)
Кликните здесь для просмотра всего текста
2
1 1 10
10 10 10
2
1 2
Yandex
Объявления
21.09.2013, 14:44     Объясните смысл задачи "3 конвейера"
Ответ Создать тему
Опции темы

Текущее время: 07:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru