Матч
432, Решетка ламп (LampsGrid)
Дивизион 2,
Уровень 2; Дивизион 1, Уровень 1
Имеется прямоугольная решетка
ламп, каждая из которых может находиться в двух состояниях: “ON” и “OFF”. Возле
каждой колонки находится переключатель, который может менять состояние всех ее
ламп на противоположный (состояние “ON” меняется на “OFF” и наоборот).
Строка решетки является
зажженной, если все ее лампы находятся в положении “ON”. Массив initial
описывает начальное состояние ламп решетки (‘1’ – лампа горит, ‘0’ – лампа
выключена). Вычислить наибольшее количество строк, которое можно зажечь совершив
в точности k переключений. Каждый из
переключателей можно переключать произвольное количество раз.
Класс: LampsGrid
Метод: int
mostLit(vector<string> initial, int k)
Ограничения: initial содержит от 1 до 50 строк, каждая из
которых содержит от 1 до 50 символа ‘0’ и ‘1’, длины всех строк initial равны,
0 £ k £ 1000.
Вход. Массив initial, описывающий начальное состояние ламп решетки (‘1’ – лампа
горит, ‘0’ – лампа выключена) и значение k.
Выход. Наибольшее количество строк, которое можно зажечь совершив в
точности k переключений.
Пример входа
initial |
k |
{"01", "10", "10"} |
1 |
{"00", "11"} |
999 |
{"01", "10", "01", "01", "10"} |
1 |
Пример выхода
2
0
3
РЕШЕНИЕ
перебор
Можно заметить, что одинаковые
строки остаются одинаковыми в процессе любой последовательности переключений.
То есть если в некоторый момент существует зажженная строка, то зажженными
будут и те строки, которые равнялись ей изначально.
Рассмотрим i - ую строку. Чтобы ее зажечь, следует совершить как минимум zeroes переключений, где zeroes равно количеству нулей в ней. Если
k < zeroes или четность k и zeroes разная, то зажечь i - ую строку сделав в точности k переключений невозможно. Если за k переключений i - ую строку можно зажечь, то одновременно с ней зажгутся и те
строки, которые равнялись ей первоначально.
Перебираем все строки. Проверяем,
можно ли очередную строку зажечь за k
переключений. Если ответ утвердительный, то находим количество строк, равных ей.
Ответом задачи будет наибольшее количество изначально равных между собой строк
(при условии что эти строки можно зажечь за k
переключений).
ПРОГРАММА
#include <cstdio>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
class LampsGrid
{
public:
int mostLit(vector<string> initial, int k)
{
int i, zeroes, res;
for(res = i = 0; i < initial.size();
i++)
{
zeroes = count(initial[i].begin(),initial[i].end(), '0');
if (zeroes % 2 == k % 2 &&
zeroes <= k)
res = max(res, count(initial.begin(),initial.end(),initial[i]));
}
return res;
}
};