Матч
306, Сортирующая машина (SortMachine)
Дивизион 2,
Уровень 1
Имеется машина для сортировки
набора различных чисел. Она имеет только одну команду MOVE с одним аргументом.
Эта команда переносит число, заданное в аргументе, в конец последовательности
чисел.
Например, для сортировки массива
чисел {19, 7, 8, 25} в возрастающем порядке
следует совершить две команды:
1. MOVE 19, получим {7, 8,
25, 19}.
2. MOVE 25, получим {7, 8,
19, 25}.
Для заданного массива чисел
необходимо найти наименьшее количество команд MOVE, в результате выполнения
которых его элементы будут упорядочены по возрастанию.
Класс: SortMachine
Метод: int countMoves(vector<int> a)
Ограничения:
a содержит от 1 до 50 различных чисел, -1000
£ a[i] £ 1000.
Вход. Массив чисел a.
Выход. Наименьшее количество команд MOVE, необходимых для сортировки
массива а по возрастанию.
Пример входа
a |
{19,7,8,25} |
{1,2,3,4,5} |
{1,3,4,5,6,7,8,9,2} |
Пример выхода
2
0
7
РЕШЕНИЕ
сортировка
Элементы отсортированного массива
можно разбить на две группы. В первую группу отнесем те числа, которые не
передвигались (они стоят в массиве слева), а во вторую – которые передвигались
командой MOVE. Очевидно, что дважды выполнять команду MOVE с одним и тем же
числом нет смысла.
Отсортируем набор входных чисел.
Двигаемся слева направо по входному и отсортированному массиву при помощи
указателей i и j. Если текущие элементы массивов равны (a[i] = b[j]), то этот
элемент не должен передвигаться. Иначе элемент неотсортированного массива a[i] должен переноситься в конец командой
MOVE.
ПРОГРАММА
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
class SortMachine
{
public:
int countMoves(vector<int>
a)
{
int i, j, res;
vector<int> b = a;
sort(b.begin(),b.end());
for(res = i = j = 0; i < a.size();
i++)
if (a[i] == b[j]) j++; else res++;
return res;
}
};