AtCoder上にある問題のうち、AtCoder Problemsでdiff 800以上と判定されているものを順番に解いていく企画。
基本的な考え方は全てコード中のコメントに入れてあるので、参照のこと。
出典:
AtCoder Beginner Contest 080 C – Shopping Street
10個の時間帯に開店するか閉店するかの状態……というわけで、bit全探索でOK。
# AtCoder Beginner Contest 080 C - Shopping Street
# https://atcoder.jp/contests/abc080/tasks/abc080_c
# tag: bit全探索 典型問題 joisinoお姉ちゃん
def main():
N = int(input())
# 各店舗のスケジュールの 0 1 列を二進数とみなして数値に変換しておく
open = [int(input().replace(' ', ''), 2) for _ in range(N)]
profit = [list(map(int, input().split())) for _ in range(N)]
result = -10**10
# bit全探索。自分の店を開ける時間帯を 1 とする。
for status in range(1, 1<<10):
tmp_r = 0
for shop in range(N):
# 各店舗のスケジュールとビット演算の & を取れば、
# 残っているビットが重複している時間帯になる。
dubbed = open[shop] & status
# 残っているビットを数える。意外とこの書き方が早い。
cnt = bin(dubbed).count('1')
tmp_r += profit[shop][cnt]
if tmp_r > result:
result = tmp_r
print(result)
main()
関連