プログラムのお勉強メモ

プログラムの勉強メモです. Python, Rust, など.

ABC128_C(Switches)

問題

考えたこと

  • 問題文が異常に難解なのと入力パターンも難解
  • とりあえず全てのスイッチのパターン試す必要がありそう
  • 制約が小さいため bit全探索 が頭をよぎる
    • 途中で 配列同士のand演算を使いたかったので numpy も使用する

実装

import numpy as np

n, m = [int(x) for x in input().split()]
k_l = []

for i in range(m):
    l = [0 for x in range(n)]
    for i, number in enumerate(input().split()):
        if i == 0:
            continue

        l[int(number)-1] = 1

    l = np.array(l)
    k_l.append(l)

on = [int(x) for x in input().split()]


def solve(l, check):
    ans = sum(l & check) % 2
    return ans


ans = 0
for x in range(2**n):
    check = [0 for x in range(n)]
    for y in range(n):
        if x >> y & 1 == 1:
            check[y] = 1

    check = np.array(check)
    add = 1
    for i, l in enumerate(k_l):
        if on[i] != solve(l, check):
            add = 0
            break
    ans += add

print(ans)

結果

  • クソバグを一件出してしまったが, 基本的な方針は正解
  • 無事に問題を見つけて AC できた
  • 割とこの手の問題は力技感があって好き