Предположим, что таксомоторная компания имеет три свободные машины (исполнители), и три заказчика (работы), желающих получить такси как можно быстрее. Фирма заботится о времени доставки такси к заказчику, так что для каждой машины стоимость определяется временем, с какой машина доберётся до места ожидания, определённого заказчиком. Решением задачи о назначениях будет распределение машин по заказчикам такое, что суммарная стоимость (суммарное время ожидания) минимальна.
Задачу о назначениях можно сделать более гибкой. В вышеприведенном примере могут оказаться не три, а четыре свободных такси, но заказчика по-прежнему три. Можно назначить четвёртого фиктивного заказчика с нулевой стоимостью, распределение же машины на фиктивного заказчика означает — «ничего не делай».
Аналогичный приём можно использовать в случае, когда число заказов может превышать число доступных машин, и машина может быть назначена на выполнение нескольких работ, а также когда работа может быть назначена нескольким исполнителям (например, если заказчик — группа, не помещающаяся в одно такси). Можно также поставить задачу увеличения дохода, а не минимизацию цены.
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
const int _DELAY = 300;
void set_cursor_position(int row, int col)
{
COORD coord;
coord.X = col;
coord.Y = row;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
void set_left_top(int *start_row, int *start_col, const int finish_row, const int finish_col)
{
while (true)
{
Sleep(_DELAY);
set_cursor_position(*start_row, *start_col);
printf("1");
*start_row = *start_row - 1;
*start_col = *start_col - 1;
if (*start_row < finish_row)
{
*start_row = *start_row + 1;
*start_col = *start_col + 2;
break;
}
if (*start_col < finish_col)
{
*start_col = *start_col + 1;
break;
}
}
}
void set_right_bottom(int *start_row, int *start_col, const int finish_row, const int finish_col)
{
while (true)
{
Sleep(_DELAY);
set_cursor_position(*start_row, *start_col);
printf("0");
*start_row = *start_row + 1;
*start_col = *start_col + 1;
if (*start_col > finish_col)
{
*start_row = *start_row - 2;
*start_col = *start_col - 1;
break;
}
if (*start_row > finish_row)
{
*start_row = *start_row - 1;
break;
}
}
}
int main()
{
printf("*** MATRIX RESOLUTION ***\n\n");
int rows;
printf("ROWS: ");
scanf("%d", &rows);
int padding_top = rows + 4;
int padding_left = 2;
int cols;
printf("COLS: ");
scanf("%d", &cols);
cols = cols + padding_left;
bool direction = true;
int start_row = padding_top;
int start_col = padding_left;
while (start_row != (padding_top - rows) + 1 || start_col != cols)
{
if (direction)
{
set_left_top(&start_row, &start_col, (padding_top - rows) + 1, padding_left);
}
else
{
set_right_bottom(&start_row, &start_col, padding_top, cols - 1);
}
direction = !direction;
}
padding_top = padding_top + 1;
set_cursor_position(padding_top, 0);
return 0;
}
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
const int _DELAY = 300;
void set_cursor_position(int row, int col)
{
COORD coord;
coord.X = col;
coord.Y = row;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
void set_left_top(int *start_row, int *start_col, const int finish_row, const int finish_col)
{
while (true)
{
Sleep(_DELAY);
set_cursor_position(*start_row, *start_col);
printf("1");
*start_row = *start_row - 1;
*start_col = *start_col - 1;
if (*start_row < finish_row)
{
*start_row = *start_row + 1;
*start_col = *start_col + 2;
break;
}
if (*start_col < finish_col)
{
*start_col = *start_col + 1;
break;
}
}
}
void set_right_bottom(int *start_row, int *start_col, const int finish_row, const int finish_col)
{
while (true)
{
Sleep(_DELAY);
set_cursor_position(*start_row, *start_col);
printf("0");
*start_row = *start_row + 1;
*start_col = *start_col + 1;
if (*start_col > finish_col)
{
*start_row = *start_row - 2;
*start_col = *start_col - 1;
break;
}
if (*start_row > finish_row)
{
*start_row = *start_row - 1;
break;
}
}
}
int main()
{
printf("*** MATRIX RESOLUTION ***\n\n");
int rows;
printf("ROWS: ");
scanf("%d", &rows);
int padding_top = rows + 4;
int padding_left = 2;
int cols;
printf("COLS: ");
scanf("%d", &cols);
cols = cols + padding_left;
bool direction = true;
int start_row = padding_top;
int start_col = padding_left;
while (start_row != (padding_top - rows) + 1 || start_col != cols)
{
if (direction)
{
set_left_top(&start_row, &start_col, (padding_top - rows) + 1, padding_left);
}
else
{
set_right_bottom(&start_row, &start_col, padding_top, cols - 1);
}
direction = !direction;
}
padding_top = padding_top + 1;
set_cursor_position(padding_top, 0);
return 0;
}
<?php
function normalize($num)
{
while ($num % 10 == 0)
{
$num = intdiv($num, 10);
}
return ($num % 100);
}
$k = 50; // k! = 30414093201713378043612608166064768844377641568960512000000000000
$result = 1;
for ($i = 2; $i <= $k; $i++)
{
$result = normalize($result * $i);
}
echo $result % 10; // 2
[ 1, 1, 1, 1, 1, 1 ]
)[ 1, 1, 1, 1, 1, 1 ]
...
[ 5, 5, 5, 5, 2, 1 ]
[ 5, 5, 5, 5, 5, 5 ]
и уменьшат последний элемент. void bubble_sort(int array[SIZE])
{
int transfer = 0;
int comparison = 0;
cout << "\nпузырьковая сортировка" << endl;
for (int i = 0; i < SIZE-1 ; i++)
{
for (int j = SIZE-2; j >= i; j--)
{
comparison++;
if (array[j] > array[j+1])
{
int temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
transfer++;
}
}
}
cout << "СРАВНЕНИЕ " << comparison << endl;
cout << "ПЕРЕСЫЛКА " << transfer << endl;
}
$arr = [
['Пн', '08:00 - 20:00'],
['Вт', '08:00 - 20:00'],
['Ср', '08:00 - 20:00'],
['Чт', '08:00 - 20:00'],
['Пт', '08:00 - 20:00'],
['Сб', '08:00 - 18:00'],
['Вс', '10:00 - 15:00'],
];
$res = "";
$i = 0;
do {
$j = $i + 1;
do {
if ($arr[$i][1] <> $arr[$j][1]) {
break;
}
$j++;
} while ($j < count($arr));
if (strlen($res) > 0) {
$res .= ", ";
}
if ($i == $j - 1) {
$res .= $arr[$i][0] . ": " . $arr[$i][1];
}
else {
$res .= $arr[$i][0] . '-' . $arr[$j - 1][0] . ': ' . $arr[$i][1];
}
$i = $j;
} while ($i < count($arr));
echo $res;
a = 'len asd sas nas sda orr' # исходная строка
x = a.split(' ') # формируем из нее массив
r.append(x[0]) # берем первый элемент с которого начнем
del x[0] # удаляем чтобы не мешал
while (len(x) > 0): # пока исходный массив не пустой
z = False # проверка на то, что слово начинается с последней буквы предыдущего слова
for i in x:
if (i[0] == r[-1][-1]): # если начинается, то добавляем в массив
r.append(i)
del x[x.index(i)]
z = True
break
if (not z): # если слово не найдено, то дописываем оставшиеся
r.extend(x)
x = []
r
>>> ['len', 'nas', 'sas', 'sda', 'asd', 'orr']
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
#x = [1, 2, 3, 4, 4, 5, 8]
#x = [5, 7, 12, 3, 3, 1, 5]
x = [123, 1, 8, 4, 120, 59, 59, 10]
if (sum(x) % 3 == 0):
tmp = sum(x) / 3
x.sort()
x.reverse()
for i in range(3):
y = []
j = 0
while (sum(y) != tmp):
if ((sum(y) + x[j]) <= tmp):
y.append(x[j])
del(x[j])
else:
j += 1
print(y)
else:
print('Вознеможно разбить на 3 равные части!')