0
0

More than 3 years have passed since last update.

AtCoder Grand Contest 過去問チャレンジ1

Last updated at Posted at 2020-03-28

AtCoder Grand Contest 過去問チャレンジ1

AGC003B - Simplified mahjong

同じカードで最大限ペアを作って、余ったら繰り越して、繰越分を優先して使ってることにする(つまり余った場合は今のカードの方を繰り越す)で OK なのだが、0枚のカードに繰越が来た場合、優先して使うカードがないので、そこで繰越分を捨てなければいけない. そこだけ気にすれば OK.

N = int(input())

result = 0
remainder = 0
for _ in range(N):
    A = int(input())
    result += (A + remainder) // 2
    if A == 0:
        remainder = 0
    else:
        remainder = (A + remainder) % 2
print(result)

AGC016A - Shrinking

s の長さはたかだか100で、アルファベットの種類も26しかないので、総当りしても TLE しない. s に含まれる全てのアルファベットについて、それが最後に残るとして、長さ N の文字列 t を長さ N−1 の文字列 t' に変える操作を実際に行って、操作回数の最小値を求めることができる.

s = input()


def f(s, c):
    result = 0
    while len(set(s)) != 1:
        t = ''
        for i in range(len(s) - 1):
            if s[i] == c or s[i + 1] == c:
                t += c
            else:
                t += s[i]
        s = t
        result += 1
    return result


result = float('inf')
for c in set(s):
    result = min(result, f(s, c))
print(result)

AGC017A - Biscuits

奇数個入っている袋は偶数個食べて、偶数個入っている袋は何袋でもいい. 奇数個入っている袋が a 袋、偶数個入っている袋が b 袋だとすると、答えは (aC0 + aC2 + ... + aCfloor(a / 2) * 2) * (bC0 + bC1 + ... + bCb) になる. ところで bC0 + bC1 + ... + bCb は 2b なので、後はループを回して奇数の袋の選び方の数を求めればよい.

def comb(n, k):
    if n - k < k:
        k = n - k
    if k == 0:
        return 1
    a = 1
    b = 1
    for i in range(k):
        a *= n - i
        b *= i + 1
    return a // b


N, P = map(int, input().split())
A = list(map(int, input().split()))

odds = sum(a % 2 for a in A)
evens = len(A) - odds

print(sum(comb(odds, i) for i in range(P, odds + 1, 2)) * (2 ** evens))

AGC007A - Shik and Stone

移動する過程で、駒が常に右または下に動いていたということは、移動回数が (H - 1) + (W - 1) 回になる. 開始地点を含めて # の数1が H + W - 1 個であれば、上や左には動いていないことになる.

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

if H + W - 1 == sum(a.count('#') for a in A):
    print('Possible')
else:
    print('Impossible')

AGC031A - Colorful Subsequence

文字列 S の中に a が n 回現れていたとすると、a を使わないパターン、1つ目の a を使うパターン、2つ目の a を使うパターン、... n つ目の a を使うパターンの n + 1 パターンがある. それぞれの文字ごとに組み合わせの数は独立なので、文字ごとに出現数を数えて、出現数 + 1 を積算したのが答えになる.

N = int(input())
S = input()

MOD = 1000000007

d = {}
for c in S:
    if c in d:
        d[c] += 1
    else:
        d[c] = 1

result = 1
for x in d.values():
    result *= x + 1
    result %= MOD
result += MOD - 1
result %= MOD

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