あるぱかのブログ

AtCoder茶(レート578)

ユニークビジョンプログラミングコンテスト2024 春(AtCoder Beginner Contest 346)

コンディション不調により後日バーチャル参加

A - Adjacent Product

リンク:A - Adjacent Product (atcoder.jp)

概要:配列 Aに対して配列 Bの各要素 B_i = A_i \times A_{i+1}を出力してね

そのまま Aを0~Nまで走査して B_iを計算して配列を作成、最後にスペース区切りで出力します。

#ABC346 A - Adjacent Product
N = int(input())
A = list(map(int, input().split()))
B = [0] * (N-1)
for i in range(N-1):
    B[i] = A[i] * A[i+1]
print(*B, sep = ' ')

提出リンク:提出 #51677468 - ユニークビジョンプログラミングコンテスト2024 春(AtCoder Beginner Contest 346)

B - Piano

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

概要:wbwbwwbwbwbwが無限に続く文字列 Sに対して、wの数 Wとbの数 Bから作成可能な文字列が Sの部分文字列となりうるか判定してね。

題名の通りピアノの白鍵と黒鍵の並びですね。

1周期(ド~シ)に鍵盤が12個あるので、まずは1周期以下になるよう W Bを引いていきます。

1周期以下に収めると Bの範囲は0~5になるので、この範囲で部分文字列としてありえる組み合わせを全部(といっても最大6通り)書いてしまえばOKです。

例えば処理後の B=1のとき Wが0~3の範囲(b、wb、bw、wwb、wbw、bww、wwbw、wbww)であれば成立します。

以下のコードでは W-Bで場合分けしていますが、上記のように Bの数に着目すると考えやすいと思います。

#ABC346 B - Piano
W, B = map(int, input().split())
ans = 'No'
#問題の文字列が1周期以下になるよう調節
while W+B >= 12:
    W -= 7
    B -= 5
#考えられる組み合わせを全列挙して判定
if W - B == 0:
    if B <= 5:
        ans = 'Yes'
elif W - B == 1 or W - B == 2:
    ans = 'Yes'
elif W - B == 3:
    if B == 2 or B == 3:
        ans = 'Yes'
elif W - B == -1:
    if B == 1 or B == 2 or B == 3:
        ans = 'Yes'
print(ans)  

提出リンク:提出 #51678570 - ユニークビジョンプログラミングコンテスト2024 春(AtCoder Beginner Contest 346)

C - Σ

リンク:C - Σ (atcoder.jp)

概要: K以下で配列 Aに含まれない数字だけを足し上げて出力してね

 Aに含まれない、ということは K以下の数字すべて足したものから[tex :A]に一度以上現れる数字の和を引けばいいと読み替えることができます。

 K以下の自然数の総和は \dfrac{K \times (K+1)}{2}で計算できます。

 Aの重複を削除したのちに A_i \leq Kのものを足し上げて先の総和から引くことで答えとなります。

下記のコードではソートを入れていますが不要だと思います。

#ABC346 C - Σ
N, K = map(int, input().split())
A = list(map(int, input().split()))
#K以下の自然数の総和
tot = K*(K+1)//2
#setで重複削除
B = sorted(set(A))
s = 0
#Ai<=Kのみ足し上げる
for i in B:
    if i <= K:
        s += i
#総和から引き算して出力
ans = tot - s
print(ans)

提出リンク:提出 #51678770 - ユニークビジョンプログラミングコンテスト2024 春(AtCoder Beginner Contest 346)

結果

A~Cの3完51分程度で本番順位だと5,500位くらいでしょうか。

B問題で苦戦しました。

今回は本戦不参加なのでレート変動無しです。