難易度評価

難易度を1〜10段階で評価できます。投票はあとから変更・取り消しできます。

難易度(投票) Lv.3.0 (1票)

投票の分布
  1. Lv.10票
  2. Lv.20票
  3. Lv.31票
  4. Lv.40票
  5. Lv.50票
  6. Lv.60票
  7. Lv.70票
  8. Lv.80票
  9. Lv.90票
  10. Lv.100票

難易度の目安を見る ↗

ログインして難易度を投票

外部サイトへ移動します

リンク先の URL を確認してから開いてください。

別タブで開く

Integers and Operators

作成者 loop0919

テスター mackerel38

難易度(作成者設定) Lv.4

難易度(投票) Lv.3.0 (1票)

実行時間制限
2 秒
メモリ制限
512 MiB

解説

op1,op2,⋯ ,opN\mathrm{op}_1, \mathrm{op}_2, \cdots, \mathrm{op}_N に含まれる + の個数を pp とします。

整数の書かれたカードの出し方 N!N! 通りと、演算子の書かれたカードの出し方 (Np)\binom{N}{p} 通りを全探索することができます。

N!⋅(Np)N! \cdot \binom{N}{p} は N≤8N \le 8 の制約下だと高々 28224002822400 となるため、適切な手続きで全列挙を行うことで十分実行時間に間に合います。

順列全列挙・組合せ全列挙のライブラリがあればそちらを使うのが簡潔です。(Python3 では itertools.permutations, itertools.combinations が利用できます。)また、適切に枝刈りをすることで、組合せ全列挙の代わりに bit 全探索で実装しても計算量は悪化しません。
なお、 DFS を用いて全列挙をしても正解することができます。

実装例(Python3)

from itertools import combinations, permutations

INF = 10**18

N = int(input())
A = [int(s) for s in input().split()]
ops = input().split()

plus_count = ops.count("+")
max_x, min_x = 0, INF

for perm in permutations(A):
    for comb in combinations(range(N), plus_count):
        comb_ops = ["^"] * N
        for c in comb:
            comb_ops[c] = "+"

        x = 0

        for a, op in zip(perm, comb_ops):
            if op == "+":
                x += a
            else:
                x ^= a

        max_x = max(max_x, x)
        min_x = min(min_x, x)

print(max_x, min_x)

ユーザー解説

ユーザー解説を書く

ユーザー解説はまだありません。