AtCoder Beginner Contest 115

はい。
https://atcoder.jp/contests/abc115

A - Christmas Eve Eve Eve

Python3

print("Christmas" + " Eve"*(25-int(input())))

リアタイでは思考停止してて全部if分岐してましたね。。でも25と日にちの差分でEveの回数がなので1行で書けましたね。

B - Christmas Eve Eve

Python3

n=int(input())
p=[]
for i in range(n):
    p.append(int(input()))
print(sum(p)-max(p)//2)

リアタイではsortとかしてましたけどもどうにか知りたいのはmaxだけなのでsortしなくても大丈夫でしたね。

C - Christmas Eve

Python3

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

sortして隣と調べる。これはsort必要です。

D - Christmas

Python3

n,x=map(int,input().split())
 
a,p=[1],[1]
 
for i in range(n):
    a.append(a[i]*2+3)
    p.append(p[i]*2+1)
 
def f(n,x):
    if n==0: return 0 if x<=0 else 1
    elif x<=1+a[n-1]: return f(n-1,x-1)
    else: return p[n-1]+1+f(n-1,x-2-a[n-1])
 
print(f(n,x))

解説の写経です。リアタイで解けませんでした。a[i]にはレベルiバーガーの時の大きさが入っています。p[i]にはレベルiバーガーの時のパティの枚数が入っています。入力が2 7だとレベル2バーガーを7層まで食べる。レベル2バーガーだとa=[1, 5, 13]とp=[1, 3, 7] 0で始まっているのでレベル2は全部で13層"BBPPPBPBPPPBB"で、Pは全部で7枚ある。f(n,x)の処理はn=2で0より大きく、x=7で1+5より大きいのでp[n-1]の3と1と、f(n-1,x-2-a[n-1]) f(2-1, 7-2-5) の結果の和が解になる。f(2-1, 7-2-5)はxが0なので、f(1-1, 0-1)が実行されてx<=0で0が返ってくる。なので3と1と0の合計4が解になる。処理の流れは追えるけどもこれでなぜ解が導けるか、正しいか、次回以降自力で書けるかというと色々難しく