AtCoder Beginner Contest 404(Promotion for Engineer Guild)の解答等の速報的まとめ
A問題
入っていない文字を1つずつ調べて、そのうち1つを出力する
A
s = input()
lst = [chr(i + ord("a")) for i in range(26) if chr(i + ord("a")) not in s]
print(lst[0])
B問題
最初に回転する回数を決めてから、違うマスが何マスあるか数える
B
def check(list_a, list_b):
res = 0
for a_i, b_i in zip(list_a, list_b):
for a_ij, b_ij in zip(a_i, b_i):
if a_ij != b_ij:
res += 1
return res
def turn(s):
return list(zip(*s[::-1]))
n = int(input())
s = [list(input()) for _ in range(n)]
t = [list(input()) for _ in range(n)]
ans = check(s, t)
s = turn(s)
ans = min(ans, check(s, t) + 1)
s = turn(s)
ans = min(ans, check(s, t) + 2)
s = turn(s)
ans = min(ans, check(s, t) + 3)
print(ans)
C問題
すべての頂点に接続している辺の数が 2 かつ、1回のDFSですべての頂点に到達できれば良い
C
import sys;sys.setrecursionlimit(10 ** 7)
n, m = map(int, input().split())
edge = [[] for _ in range(n)]
for _ in range(m):
u, v = map(lambda x:int(x) - 1, input().split())
edge[u].append(v)
edge[v].append(u)
if n != m:
exit(print("No"))
check = [False] * n
def dfs(now, old = -1):
if check[now]:
return
check[now] = True
for to in edge[now]:
if to == old:
continue
dfs(to, now)
dfs(0)
print("Yes" if all(check) and all(len(e_i) == 2 for e_i in edge) else "No")
D問題
bit全探索を3進数で行う
D
n, m = map(int, input().split())
zoo = list(map(int, input().split()))
zoo_list = [set() for _ in range(n)]
for i in range(m):
k, *a = map(lambda x:int(x) - 1, input().split())
for a_i in a:
zoo_list[a_i].add(i)
ans = float("inf")
for bit in range(3 ** n):
lst = []
for _ in range(n):
lst.append(bit % 3)
bit //= 3
count = [0] * m
ans_i = 0
for i, cnt in enumerate(lst):
if cnt:
ans_i += zoo[i] * cnt
for animal_i in zoo_list[i]:
count[animal_i] += cnt
if min(count) >= 2:
ans = min(ans, ans_i)
print(ans)
E問題
$N-1$から降順に操作する
運べる茶碗の中にすでに豆があるときはその茶碗に入れる
豆が入っている茶碗がないときは一番遠くにおける茶碗に入れればよい
E
n = int(input())
c = list(map(int, input().split()))
a = list(map(int, input().split()))
ans = 0
for i in range(n - 2, -1, -1):
if a[i] == 0:
continue
ans += 1
nxt = 0
dist = n + 10
flag = False
for c_i in range(c[i]):
if a[i - 1 - c_i] > 0:
flag = True
elif dist > i - 1 - c_i - c[i - 1 - c_i]:
nxt = i - 1 - c_i
dist = i - 1 - c_i - c[i - 1 - c_i]
if not flag:
a[nxt] += 1
print(ans)