名もなき未知

エンジニアリングとか、日常とかそういうのをまとめる場所。

ABC115振り返り

3完。10分くらいで再帰処理で十分だと判断してから、時間内に細かい桁数のバグが残り、うまくいかないという良くない回だった。

A問題

beta.atcoder.jp

分岐するだけ。ワンライナーでもかけそうな気がする。多分 print("Christmas" + (" Eve" * (25 - int(input()))))

d = int(input())
if d == 25:
  print("Christmas")
elif d == 24:
  print("Christmas Eve")
elif d == 23:
  print("Christmas Eve Eve")
elif d == 22:
  print("Christmas Eve Eve Eve")

B問題

beta.atcoder.jp

sum とって max(a_i) / 2 する。

本番ではわざわざmax要素であるかどうかチェックした上に、max要素であるものが複数存在した場合にチェックするようにフラグを入れているが、今にもバグりそうな微妙な実装である。

n = int(input())
al = [int(input()) for _ in range(n)]
m = max(al)
s, f = 0, True
for i in range(n):
  if al[i] == m and f:
    s += al[i] // 2
    f = False
  else:
    s += al[i]
print(s)

スマートに書くならこれだけで十分なはず。

al = [int(input()) for _ in range(int(input()))]
print(sum(al) - max(al) // 2)

C問題

beta.atcoder.jp

入力をソートし、 ik - 1 + i の差分のリストをもとめ、リストの中で最小値となるものを求めれば良い。

#!/usr/bin/env python
# -*- coding: utf-8 -*-


def solve():
    n, k = map(int, input().split())
    hl = [int(input()) for _ in range(n)]
    hl.sort()
    diff = hl[k - 1] - hl[0]
    for i in range(0, n - k + 1):
        td = hl[k - 1 + i] - hl[i]
        diff = min(td, diff)
    print(diff)


if __name__ == "__main__":
    solve()

これももう少しキレイに書けるなああ。。

n, k = map(int, input().split())
hl = [int(input()) for _ in range(n)]
hl.sort()
print(min([hl[k - 1 + i] - hl[i] for i in range(0, n - k + 1)]))

D問題

beta.atcoder.jp

再帰処理に落とすことができる。前計算で前のハンバーガーの高さと、パティの量を計算しておく。

レベルAの半分によりも食べた段数が多い場合は、レベルA-1分は食べていることになるので、どんどん加算していきレベル1になったときに終了になるようにした。(レベル0まで見続ける方法もあるらしいが、どうもレベル1で判断十分でしょ、と僕は考えたようだ(制約が 1 <= N <= 50 だったのでレベル0だけの時を考慮する必要なし))半分よりも少ない場合はとりあえず一番上のパンズだけ食べる形にした。

半分食べる際は真ん中に挟まっているパティの考慮もお忘れなく(この処理が不適切で下二桁が全然合わなかった)。

また、私の方法では最後レベル1ハンバーガーを食べる際の段数を判定するロジックで、幾層にもあるようなP(パンズ)があった際に不具合が起きたので5枚以上の場合は3P足して終了にしている。(というのも構造上、最後の方にはPが固まっているのでそれはそう、そしてここの処理も不適切でリスト外アクセスのREを起こしていた)

#!/usr/bin/env python
# -*- coding: utf-8 -*-

al = [0, 5] + [0] * 49
bl = [0, 3] + [0] * 49


def solve2(ans, x, idx):
    if idx == 1:
        if x >= 5:
            return ans + 3
        if x <= 0:
            return ans
        return ans + (0, 0, 1, 2, 3, 3)[x]
    if x >= al[idx - 1] + 1:
        ans += bl[idx - 1]
        x -= al[idx - 1] + 1
        if x >= 1:
            ans += 1
            x -= 1
    else:
        x -= 1
    return solve2(ans, x, idx - 1)


def solve():
    n, x = map(int, input().split())
    for i in range(2, n + 1):
        al[i] = al[i - 1] * 2 + 3
        bl[i] = bl[i - 1] * 2 + 1
    print(solve2(0, x, n))


if __name__ == "__main__":
    solve()

冷静に書けばきれいに書くことができるのに何を焦っていたんだか。

終わり。