[AtCoder] ABC 128 C – Switches
問題
方針
ビット全探索
制約を見ずにこの問題を解こうとすると、ドツボに嵌るかもしれません。スイッチの数と電球の数は最大でも \( 10 \) なので、全探索を考えます。スイッチの状態は on/off の \( 2 \) 通りなので、ビット全探索を用います。
例えば、スイッチが on のときを \( 1 \)、off のときを \( 0 \) と表します。スイッチの数が \( 3 \) 個のとき、スイッチの状態のパターンは、\( (0, 0, 0)\), \( (0, 0, 1)\), \( (0, 1, 0)\), \((1, 0, 0) \), \( (0, 1, 1)\), \( (1, 0, 1)\), \(( 1, 1, 0)\), \( (1, 1, 1)\) の \( 2^3 \) 通りあります。
実装
全体のスイッチの状態はビット列で表現できるので、ある電球に接続されているスイッチが on である個数を数え上げ、条件を満たすかどうか調べます。これを全ての電球に対して行います。
コード
提出したコード
ビット全探索と実装部分
int bit[10]{}; set<int> set0[10]{}; // 電球に接続しているスイッチ int p[10]{}; int cnt = 0; void solve() { for (int i = 0; i < M; i++) { int sum = 0; for (int j = 0; j < N; j++) { if (bit[j] == 1 && set0[i].count(j) == 1) sum++; } if (sum % 2 != p[i]) return; } cnt++; } void rec(int k) { if (k == N) { solve(); return; } rec(k + 1); bit[k] = 1; rec(k + 1); bit[k] = 0; }
ディスカッション
コメント一覧
まだ、コメントがありません