1
1

More than 3 years have passed since last update.

AtCoder Beginner Contest 148 参戦記

Last updated at Posted at 2019-12-22

AtCoder Beginner Contest 148 参戦記

ABC148A - Round One

2分半で突破. 簡単なんだけど、なんかシンプルに書こうと思うと難しいなあと思った.

A = int(input())
B = int(input())

print(*(set([1, 2, 3]) - set([A, B])))

ABC148B - Strings with the Same Length

1分半で突破. 書くだけ. zip かなあと思いつつ使わなかった.

N = int(input())
S, T = input().split()

print(''.join(S[i] + T[i] for i in range(N)))

ABC148C - Snack

3分で突破. 最小公倍数が答えだけど、どう解けばいいんだっけ、最大公約数が分かれば分かる?と思いつつ、Google に「最小公倍数 Python」ってググったら lcm(a, b) = a * b / gcd(a, b) って出てきたので書いて終わり.

from fractions import gcd

A, B = map(int, input().split())

print(A * B // gcd(A, B))

ABC148E - Double Factorial

20分くらい?で突破. WA1. Dをちょっと考えたけど難しかったので、飛ばしてこっちをやってみた. とりあえずナイーブに f(n) を実装して、動かしてみた. N が奇数のときは常に0はすぐ分かった.
N // 10 で入力例3を流すとだいぶズレたので、n 増やして試してみたところ、f(50) で数字がずれて、50には5が含まれるからカーとなる. N // 10 + N // 50 でも入力例3とは合わず、脳内で次は250カーとなってようやくからくりが分かって実装. while t <= N:while t < N: と書いて WA を食らったが無事AC.

from sys import exit

N = int(input())

if N % 2 == 1:
    print(0)
    exit()

result = 0
t = 10
while t <= N:
    result += N // t
    t *= 5
print(result)

ABC148D - Brick Break

27分くらい?で突破. 右から処理することばっかり考えてて、難しいなと飛ばしてEからやって戻ってきたんだけど、順位表の状況から明らかに簡単なので、多分考えすぎてると左から処理することを考えたら簡単だった orz.

N = int(input())
a = [int(s) - 1 for s in input().split()]

result = 0
for i in range(N):
    if a[i] != (i - result):
        result += 1

if result == N:
    print(-1)
else:
    print(result)

ABC148F - Playing Tag on Tree

突破できず. ミニマックス法なのは分かったけど、過去問であたったのは一回だけで、幅優先だとどうなるんだろうと考えているうちに終わった. 精進不足.

追記: ミニマックス法じゃなかった(爆). 解説PDF通りで、青木さんから一番遠いところかつ高橋さんのほうが一番近いところの一個手前で捕まる感じで実装すれば良い.

from sys import exit

N, u, v = map(int, input().split())

if u == v:
    print(0)
    exit()

edges = [[] for _ in range(N + 1)]
for _ in range(N - 1):
    A, B = map(int, input().split())
    edges[A].append(B)
    edges[B].append(A)


def calc_destination(start, edges):
    destination = [-1] * (N + 1)
    destination[start] = 0
    q = [start]
    while len(q) != 0:
        current = q.pop()
        for n in edges[current]:
            if destination[n] != -1:
                continue
            destination[n] = destination[current] + 1
            q.append(n)
    return destination


tak = calc_destination(u, edges)
aok = calc_destination(v, edges)

result = 0
for i in range(1, N + 1):
    aoki = aok[i]
    if tak[i] >= aoki:
        continue
    if aoki > result:
        result = aoki
print(result - 1)
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1