あるぱかのブログ

AtCoder茶(レート578)

AtCoder Beginner Contest 347

A - Divisible

リンク:A - Divisible (atcoder.jp)

概要:配列 Aのうち Kの倍数であるものについて \dfrac{A_i}{K}を出力してね

 A_iを順番に見て Kで割った余りが0であれば \dfrac{A_i}{K}を計算して空の配列 ansに格納、最後に半角スペース区切りで出力します。

#ABC347 A - Divisible
N, K = map(int, input().split())
A = list(map(int, input().split()))
ans = []
for i in range(N):
    if A[i] % K == 0:
        ans.append(A[i]//K)
print(*ans, sep = ' ')  

提出リンク:提出 #51802776 - AtCoder Beginner Contest 347

ちなみに配列 ansを用意しなくても以下のように末尾を改行ではなく半角スペース(' ')として出力してもいいみたいです。

(末尾に不要な半角スペースがつくので本番では怖くて避けました)

#ABC347 A - Divisible
N, K = map(int, input().split())
A = list(map(int, input().split()))
for i in range(N):
    if A[i] % K == 0:
        print(A[i]//K, end = ' ')  

提出リンク:提出 #51880006 - AtCoder Beginner Contest 347

B - Substring

リンク:B - Substring (atcoder.jp)

概要:文字列 Sの部分文字列としてあり得るものが何種類か出力してね

 Sは最大100文字ということで、1文字取り出す場合は100通り、2文字なら99通り・・・と考えると最大 \dfrac{N \times (N+1)}{2}で5000通りくらいで済みそうなので全探索します。

二重for文で始点と終点を指定してスライスで部分文字列を取り出し、セット ansにaddしていきます。

最後にセットの長さ=部分文字列の種類数を出力します。

初めからセットで持っておくほうが速いですが、初めは配列として最後にセットを取る方法でも問題ないと思います。

#ABC347 B - Substring
S = input()
ans = set()
for i in range(len(S)):
    for j in range(1, len(S)+1):
        if S[i:j] != '':
            ans.add(S[i:j])
print(len(ans))  

提出リンク:提出 #51814826 - AtCoder Beginner Contest 347

C - Ideal Holidays

リンク:C - Ideal Holidays (atcoder.jp)

概要:配列 Dがすべて休日になる可能性があるか判定してね

3回WA叩きましたが何とか時間内にACできました。

予定の数 N = 2 \times 10^{5}、休日と平日 A,B \leq 10^{9}なのですべての予定を1日ずつずらして休日に収まるか判定する方法は使えなさそうです。

なのでお気持ちとしては予定のある日が幅 Aに収まるかどうか判定できればよさそうです。

・最初の予定を仮に休日初日として( D_i - D_0を計算して)、 A+Bで割ることで1週間にまとめる

・上記の値を仮に xとして、休日であればそのまま、その週の休日からはみ出す場合は A+Bを引いて休日の何日前という表現に変える

・この処理を D_0除く N-1回行う中で最大値と最小値を記録しておく

・最大値と最小値の幅が休日の日数 Aに収まればYesを出力する

#ABC347 C - Ideal Holidays
N, A, B = map(int, input().split())
D = list(map(int, input().split()))
E = []
mx = 0
mn = 10**10
for i in range(1,N):
    x = (D[i]-D[0])%(A+B)
    if x >= A:
        x = x-(A+B)
    mx = max(mx, x)
    mn = min(mn, x)
    E.append(x)
if mx - mn < A:
    print('Yes')
else:
  print('No')  

提出リンク:提出 #51865968 - AtCoder Beginner Contest 347

ちなみにWA2回は休日の何日前の考え方を思いつく前で、3回目は出力時の判定を \leq Aにしていたことが原因でした。

結果

A~Cの3完、WA3回のペナルティ含めて98分でした。

パフォーマンス856で2回連続の緑パフォ、レートは501→548と順調に伸びました。

C問題はもうちょっと早く発想できていれば、D問題はビット演算に慣れていれば解けたのかな?

いずれにしても茶色中位~緑下位の問題に慣れていないので数こなすのがよさそうです。