Все фишки в одном месте

Даны фишки, пронумерованные от 0 до n. Они находятся в позициях, от 1 до m. Массив chipsпоказывает, что фишка chips[i]находится в позиции i.
Фишки можно переставлять влево или вправо на 1 или 2 шага любое количество раз. Каждая перестановка фишки имеет стоимость:
  • Переместить i-ю фишку влево или вправо на две позиции стоит 0.
  • Переместить i-ю фишку влево или вправо на одну позицию стоит 1.
Изначально на одной позиции могут находиться несколько фишек.
Вернуть минимальную стоимость того, что мы можем переместить все фишки в одну позицию.
Пример 1:
Дано: chips = [1,2,3] - три фишки расставлены на разных местах 1, 2, 3
Результат: 1
Пояснение: Если мы хотим сместить всё в 1-ю позицию, то из позиции 3 мы переходим за нулевую стоимость, а из позиции 2 - за стоимость 1. Аналогично, если мы хотим сместить всё в позицию 3. Если мы хотим сместить всё в позицию 2, то стоимость перемещения из позиции 1 и 3 будет стоить нам по 1, то есть суммарно 2, а это не минимальная стомость, которая равна 1. 
Пример 2:
Дано: chips = [2,2,2,3,3]
Результат: 2
Пояснение: Позиция 1 у нас пустая. В позиции 2 у нас 3 фишки. А в позиции 3 - 2 фишки.
Если мы хотим сместить всё в позицию 1, то это будет стоить суммарно 3, потому что из позиции 3 в 1 стоит 0, а в позиции 2 у нас 3 фишки и стоиомсть перемещения каждой = 1, поэтому суммарная стоимость равна 3. Аналогично, если мы хотим всё сместить в позицию 3. Только при этом в позиции 1 у нас нет ничего.
Еслии мы хотим всё сместить в позицию 2, то нужно переместить две фишки из позиции 3, что будет стоить нам 2. И это минимальная стоимость.

Ограничения:
  • 1 <= chips.length <= 100
  • 1 <= chips[i] <= 10^9
Идея решения
Мы помним, что перемещение на 2 позиции не стоит ничего. Поэтому мы можем сместить все нечётные фишки в позицию 1, а все чётные фишки в позицию 2 с нулевой стоимостью.
Затем мы просто объединим две стопочки, перемстив наименьшу поверх наибольшей. Если обе стопочкки одинаковы, то без разницы, куда что двигать. В любом случае минимум между чётной и нечетной стопочкой будет нашим результатом.

Компилируемое решение 

public int minCostToMoveChips(int[] A) {
        int odd = 0, even = 0;
        for(int a : A)
            if(a % 2 == 0)
                ++even; // считаем фишки на нечетных позициях - 
// это будет стопка в позиции 1
            else
                ++odd; // стопка в позиции 2 (на чётных позиция)
        return Math.min(odd,even); // берем минимум
    }

Комментарии

Популярные сообщения из этого блога

Разбиение числа на сумму с максимальным произведнием слагаемых

Число подмассивов, в которых сумма элементов равна k

Сложить два числа, которые представлены списком