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|ヶ所あります)に対して全部で
個の直後の
を構成する文字に一致しない文字を挿入し、
の末尾に文字を
個挿入するような場合の数なので、これは
として表せます。計算量は
です。