0
0

More than 3 years have passed since last update.

AtCoder Beginner Contest 184 参戦記

Last updated at Posted at 2020-11-22

AtCoder Beginner Contest 184 参戦記

ABC でC問題解けなかったの初めて…….

ABC184A - Determinant

1分で突破. 書くだけ.

a, b = map(int, input().split())
c, d = map(int, input().split())

print(a * d - b * c)

ABC184B - Quizzes

3分で突破. 書くだけ.

N, X = map(int, input().split())
S = input()

result = X
for c in S:
    if c == 'o':
        result += 1
    elif c == 'x':
        if result != 0:
            result -= 1
print(result)

ABC184C - Super Ryuma

突破できず. 頭真っ白になりました.

ABC184D - increment of coins

突破できず. 入出力例でも TLE したり、NaN になったりと上手く行かず.

追記: 確率DP. 金貨が X 枚、銀貨が Y 枚、銅貨が Z 枚になる確率を f(X, Y, Z) とすると、f(X, Y, Z) = (f(X - 1, Y, Z) * (X - 1) + f(X, Y - 1, Z) * (Y - 1) + f(X, Y, Z - 1) * (Z - 1)) / (X + Y + Z - 1) となる. 0≦X,Y,Z≦100 なので、全て求めてもたかだか O(106) なので、全て求めて問題ない. 確率が全て求まれば 0≦X,Y≦99 に対して、f(100, X, Y)、f(X, 100, Y)、f(X, Y, Z) に操作回数である (100 + X + Y) - (A + B + C) を掛けたものを積算すれば期待値が求まる.

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

M = 101


def despread(x, y, z):
    return x * M * M + y * M + z


dp = [0] * (despread(100, 100, 100) + 1)
dp[despread(A, B, C)] = 1.0

for i in range(A, 100):
    for j in range(B, 100):
        for k in range(C, 100):
            if i + j + k == A + B + C:
                continue
            t = 0
            if i != 0:
                t += dp[despread(i - 1, j, k)] * (i - 1)
            if j != 0:
                t += dp[despread(i, j - 1, k)] * (j - 1)
            if k != 0:
                t += dp[despread(i, j, k - 1)] * (k - 1)
            dp[despread(i, j, k)] = t / (i + j + k - 1)

result = 0
D = A + B + C
for i in range(100):
    for j in range(100):
        t = 0
        t += dp[despread(99, i, j)]
        t += dp[despread(i, 99, j)]
        t += dp[despread(i, j, 99)]
        result += ((100 + i + j) - D) * t * 99 / (99 + i + j)
print(result)

ABC184E - Third Avenue

CとDを諦めてから始めたので何分かかったのか不明. 56分未満なのは確か. 見るからに難しそうなところが何もなく、何か罠があるのかと思いながら実装したけど、何も罠はなかった(笑). ワープだけは繰り返しトライするとヤバそうだったので、一回しかトライしないようにしたけど、これは見え見えすぎて罠ではないな(笑).

from collections import deque

INF = 10 ** 9

H, W = map(int, input().split())
a = [input() for _ in range(H)]

d = {}
for h in range(H):
    for w in range(W):
        c = a[h][w]
        if c in 'SG':
            d[c] = (h, w)
        elif c in '.#':
            continue
        else:
            if c in d:
                d[c].append((h, w))
            else:
                d[c] = [(h, w)]

not_warped = {}
for c in 'abcdefghijklmnopqrstuvwxyz':
    not_warped[c] = True


def move(h, w, p):
    c = a[h][w]
    if c == '#':
        return
    if t[h][w] > p:
        t[h][w] = p
        q.append((h, w))


t = [[INF] * W for _ in range(H)]
h, w = d['S']
t[h][w] = 0
q = deque([(h, w)])
while q:
    h, w = q.popleft()
    c = a[h][w]
    p = t[h][w] + 1
    if 'a' <= c <= 'z' and not_warped[c]:
        for nh, nw in d[c]:
            if t[nh][nw] > p:
                t[nh][nw] = p
                q.append((nh, nw))
        not_warped[c] = False
    if h != 0:
        move(h - 1, w, p)
    if h != H - 1:
        move(h + 1, w, p)
    if w != 0:
        move(h, w - 1, p)
    if w != W - 1:
        move(h, w + 1, p)

h, w = d['G']
if t[h][w] == INF:
    print(-1)
else:
    print(t[h][w])

ABC184F - Programming Contest

突破できず. 半分全列挙を知っていればそれほど難しくもなかった.

from bisect import bisect_left

N, T, *A = map(int, open(0).read().split())

s0 = {0}
for a in A[:N // 2]:
    for x in s0.copy():
        if x + a > T:
            continue
        s0.add(x + a)

s1 = {0}
for a in A[N // 2:]:
    for x in s1.copy():
        if x + a > T:
            continue
        s1.add(x + a)

ys = sorted(s1)
result = 0
for x in s0:
    i = bisect_left(ys, T - x + 1) - 1
    result = max(result, x + ys[i])
print(result)
0
0
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
0
0