Нажмите "Enter" для перехода к содержанию

В круглосуточном супермаркете, где работает 20 касс, есть только одна хранительница ключей для отмены операций — Галя

В круглосуточном супермаркете, где работает 20 касс, есть только одна хранительница ключей для отмены операций — Галя. Кассиры работают в три смены. После каждого использования ключа для отмены операций в системе сохраняется информация о номере кассы и номере смены. Оба номера представляются с минимально возможным количеством бит и записываются последовательно. В конце месяца, когда проводятся итоги,

Ответ:

расчетов, Галя обнаруживает, что на одну операцию больше, чем на другие, имеет оставаться без ответа. У Гали есть подозрения, что операцию совершил один из кассиров. Как же вычислить преступника?

Для решения этой задачи можно использовать битовые операции и логические операции.

Для начала, нужно разобраться, сколько информации содержится в каждом числе, чтобы понять, сколько операций производились на каждой кассе и в каждой смене.

Дано:
— 20 касс
— 3 смены

Используем двоичную систему счисления, чтобы записывать номера касс и смен. Для 20 касс нужно 5 битов (2^5 = 32, ближайшая степень двойки большая или равная 20). Для 3-х смен нужно 2 бита (2^2 = 4, ближайшая степень двойки большая или равная 3).

Теперь необходимо создать двумерный массив, в котором каждому элементу будет соответствовать касса и смена, а значение элемента будет обозначать количество операций, которые были выполнены на этой кассе и в этой смене. Начальные значения всех элементов массива устанавливаются равными нулю.

Пусть массив будет иметь размерность 20 на 3:

int[][] operations = new int[20][3];

Теперь, когда массив создан, нужно пройтись по всем сохраненным операциям и увеличить соответствующий элемент массива на единицу.

Предположим, что у нас есть два числа: 01001 (номер кассы) и 11 (номер смены). Для того, чтобы увеличить соответствующий элемент массива на единицу, нужно использовать битовые операции.

Для увеличения элемента operations[2][3] (третья касса, вторая смена) на единицу, нужно выполнить следующую операцию:

operations[2][3]++;

Теперь в массиве operations будет на единицу больше операций на третьей кассе и второй смене.

Когда все операции в месяце закончены, можно приступить к поиску подозреваемого кассира. Для этого можно пройтись по всем элементам массива и найти наибольшее значение.

int maxOperations = 0;
int[] suspect = new int[2]; // suspect[0] - номер кассы, suspect[1] - номер смены

for (int i = 0; i < operations.length; i++) {
    for (int j = 0; j  maxOperations) {
            maxOperations = operations[i][j];
            suspect[0] = i; // номер кассы
            suspect[1] = j; // номер смены
        }
    }
}

Теперь в переменной suspect будет храниться номер кассы и номер смены подозреваемого кассира.

Чтобы ответить на вопрос задачи, нужно вывести значение suspect[0] и suspect[1] (номер кассы и номер смены подозреваемого кассира) на экран.

Например:

System.out.println("Подозреваемый кассир: Касса " + suspect[0] + ", Смена " + suspect[1]);

Таким образом, можно вычислить преступника, основываясь на информации о количестве операций на каждой кассе и в каждой смене, сохраненной в массиве operations.