Матч 307, Обмен ботинками (BootsExchange)

Дивизион 2, Уровень 1

 

Фабрика, производящая обувь, передала магазину n левых и n правых ботинков. Каждый ботинок имеет определенный размер. Левый и правый ботинок образуют пару, если они имеют одинаковый размер. Каждый ботинок может принадлежать только одной паре. Магазин хочет составить n пар, поменяв при этом у фабрики наименьшее количество ботинок.

Массивы left и right содержат размеры соответственно левых и правых ботинков, поступивших из фабрики в магазин. Размер каждого массива равен n.

 

Класс: BootsExchange

Метод: int leastAmount(vector<int> left, vector<int> right)

Ограничения: left и right содержат одинаковое количество элементов, от 1 до 50 элементов, 1 £ left[i], right[i] £ 1000.

 

Вход. Массивы left и right, содержащие размеры соответственно левых и правых ботинков.

 

Выход. Наименьшее количество ботинков, которое следует поменять для образования n пар.

 

Пример входа

left

right

{1, 3, 1}

{2, 1, 3}

{1, 3}

{2, 2}

{1, 2, 3, 4, 5, 6, 7}

{2, 4, 6, 1, 3, 7, 5}

 

Пример выхода

1

2

0

 

 

РЕШЕНИЕ

обработка массива

 

Заведем массив Count размера 1001, каждую ячейку которого Count[i] будем увеличивать на 1, если пришел левый ботинок размера i, и уменьшать на 1, если пришел правый ботинок размера i. Если по размеру i излишков нет (то есть количество левых ботинков размера i равно количеству правых того же размера), то по окончанию обработки Count[i] будет равняться 0. Иначе модуль значения Count[i] равен числу ботинков, которым не нашлось пар. Сумма

S =

всегда является четным числом и равна числу ботинок, которым нет пары. Половину из них всегда можно поменять так, чтобы получить набор из пар ботинок.

 

ПРОГРАММА

 

#include <cstdio>

#include <vector>

using namespace std;

 

int i,res,Count[1001];

 

class BootsExchange

{

public:

  int leastAmount(vector<int> left, vector<int> right)

  {

    for(i = 0; i < left.size(); i++)

      Count[left[i]]++, Count[right[i]]--;

    for(i = res = 0; i < 1001; i++)

      res += abs(Count[i]);

    return res / 2;

  }

};