AtCoder Beginner Contest 115
AtCoder Beginner Contest 115を解きました。
A - Christmas Eve Eve Eve(100点)
問題
なら'Christmas'と出力し、24以下なら足りない分だけ'Eve'を追加で出力する。
解き方
if文で全パターンやる。
今回の問題の場合なら最初に'Christmas'と出力してfor文を使っての間'Eve'を出力する方法もある。
B - Christmas Eve Eve(200点)
問題
品物をN個買ったときに、定価が一番高い品物が半額になって残りは定価になるときの支払合計金額。
解き方
N個の品物の定価の合計と定価の最大値を求めて合計から最大値の半分を引いたものを出力。
C - Christmas Eve(300点)
問題
の最小値を求める。
解き方
配列hをソートしてi=0からi+k-1<nの範囲の全パターンの最小値を出力。
D - Christmas(400点)
問題
レベル0のバーガーはパティ1枚である。
レベルのバーガーはパン1枚、レベルのバーガー、パティ1枚、レベルのバーガー、パン1枚を積み重ねたものである。
レベルのバーガーを下から層食べたときのパティを食べる枚数を求める。
解き方
単純な解き方の場合、レベルのバーガーを作り下からパティの数を数え上げる方法が考えられるが、に対する層の数はなのでTLEになってしまう。
そこで、以下の2点に注目する。
・レベル1以上のバーガーの層は1つ下のレベルのバーガーの2倍に3を加算した数
・パティの数は1つ下のレベルのバーガーの2倍に1を加算した数
この2つの情報を使って再帰で解く。
再帰関数はバーガーのレベルと食べる層の数を受け取り食べたパティの数を返す。
受け取った値から3つの状態に分けることができる。
:半分も食べない return dfs(N-1,X-1)
:半分まで食べる return +1
:半分よりも多く食べる return +1+dfs(N-1,X-(+2))
これをレベル0になるかKが1以下になるまで続け、レベル0のときにXが1以上なら1を返し、それよりも前のレベルででXが1以下になったら0を返すと解ける。