残り30分で4完までいったところで酒を飲んだよね。
A - Fifty-Fifty
4文字からなる文字列が2種類の文字それぞれ2文字ずつから成るかどうか判定させられる。
無限に実装のバージョンがあるので好きなやつを使う(解説になってない)。
s = sorted(input()) if s[0] == s[1] and s[2] == s[3] and len(set(s)) == 2: print("Yes") else: print("No")
B - Ordinary Number
ある数列の連続する3要素 のうちが2番目に小さいところになる箇所の数を求める。
なにげに 二番目に小さい が罠で、3数なので 二番目に大きい とも言えることに注意して、1からn-1までiの前後をみてやる
n = int(input()) arr = list(map(int, input().split())) count = 0 for i in range(1, n - 1): if arr[i - 1] < arr[i] < arr[i + 1] or arr[i - 1] > arr[i] > arr[i + 1]: count += 1 print(count)
C - Divide the Problems
偶数個の要素をもつ数列を2つに分けるとき、一方の最大値が以下、他方の最小値が以上になるような整数はいくつあるだろうか。
ソートしたら真ん中の二要素の差になるのでそうする。
n = int(input()) arr = list(sorted(list(map(int, input().split())))) print(arr[n//2] - arr[n//2 - 1])
D - Blue and Red Balls
要約が難しいので抽象的にすると、個の赤玉を並べ、そのそれぞれの間(両端含む)に0個以上の個の青玉を並べるときの並び方。
まず青玉を並べられる場所は赤玉の間および両端でありこれが箇所。ここに個の青玉をグループに分けて並べるとして、通りの選択ができる。nCr
の組み合わせの数はググるとアルゴリズムが出てくる。
ここまでわかって、じゃあ残りの、各グループにふりわける個の青玉の組み合わせってどうすんだろ、となってK=5くらいまで書き出してみるとどっかでみたことある分け方だと気づき、適当に「高校数学 グループ分け」みたいなワードでググって 二項係数とかいう単語にぶちあたり、それっぽかったので更に適当に「python 二項定理」でググって最初に出てきたやつをコピペして貼って計算。 毎回10**9+7であまりをだす。pythonなので桁は気にせず最後にやりゃいいだろ(と、ビクビクしながら提出)
# ncrをうまく使う感じ # 二項定理はググった https://qiita.com/r_u__r_u/items/5e5baeb0194854cbf156 from math import factorial n, k = map(int, input().split()) nn = n - k + 1 # 使える箇所 def ncr(n, r): res = 1 for i in range(1, r+1): res = res * (n-i+1)//i return res def calc(k): return [factorial(k)//(factorial(i)*factorial(k-i)) for i in range(k+1)] nikouteiri = calc(k-1) for i in range(1, k + 1): # 使える箇所からi個とり、kをi個のグループに分けたやつをかける print((ncr(nn, i) * nikouteiri[i-1]) % (10**9+7))
本番中解けなかったE, Fについては後日〜