AtCoder Beginner Contest 171
ABC171 解説
A: αlphabet
αが小文字であるということは、αが'a'以上'z'以下であるということです。従って、次のようなコードによって答えを求めることができます。
a = input() if 'a' <= a and a <= 'z': print('a') else: print('A')
また、多くの言語には標準で小文字かどうか判定する関数が用意されているので、それを使って解くこともできます。
a = input() if str.islower(a): print('a') else: print('A')
B: Mix Juice
個の果物のうち、安い順に個買うのが最適です。もしそうでない買い方をする場合、安い順に見て番目以上の果物を買うことになりますが、その果物を買わずに安い方から番目以内の果物を買うとより安くなるので、これが最適であることを示せます。
簡単な実装としては、をソートし、先頭から個の和を求めると良いでしょう。
N, K = map(int, input().split()) p = sorted(list(map(int, input().split()))) print(sum(p[0:K]))
C: One Quadrillion and One Dalmatians
を、整数が与えられた時に番号の犬の名前を返す関数とします。すると、には次のような性質があります。
- の時、アルファベットの番目を返す。
- の時、をで割った値を、あまりをとして、を返す。
これを適切に実装すると答えを導出できます。計算量はです。
def f(x): if 1 <= x and x <= 26: return chr(ord('a') + x - 1) else: return f((x - 1) // 26) + f(x % 26) N = int(input()) print(f(N))
D: Replacing
数列を、となるようなの個数と定義します。この時、なので、の長さはもあれば十分です。また、を操作が行われる前の数列の全ての要素の和と定義します。この時、回目の操作はにを足し、をにする操作と考えることができます。また、この時のと書けるので、十分に高速に求めることができます。計算量はです。
E: Red Scarf
任意の整数に対して、になる性質を利用します。特に、を奇数回を取ったものはに一致します。
を番号が書かれたすぬけくんのスカーフに書かれた整数とし、とすると、と表すことができるので、が求まっているならばとして高速に導出できることが分かります。
ここで、は、をの形に展開すると各を丁度奇数回ずつ含むことから、これは、すなわちに一致するので、この問題を解くことができました。計算量はです。
F: Strivore
まずは計算量のDPを考えてみましょう。DPを、次のように定義します。
- は、左から番目までの文字を決定して、その文字列がの番目までの文字列を部分文字列に含み、番目までの文字列を部分文字列に含まないようなものの個数
- は通り
- はを次に使うとを使わないの和
- はを次に使うと自由に文字を選べるの和
- 答えは
さて、このDPでは、を部分文字列として含むか含まないかで遷移が変化し、文字によらないことが分かります。そこで、を丁度文字目までを見た時にを部分文字列に含むような文字列の個数とすると、答えはと表せることが分かります。また、はの末尾でない場所(このような場所は全部で|S|ヶ所あります)に対して全部で個の直後のを構成する文字に一致しない文字を挿入し、の末尾に文字を個挿入するような場合の数なので、これはとして表せます。計算量はです。