0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AtCoderをPythonで取り組んだ振り返り(ABC440 A~B、C追加)

Last updated at Posted at 2026-01-10

どうもこんにちは!

今週が2026年の初コンテスト参加で、Bまで完答、振り返りBもまで。
Cは余りを書き出すと周期があるのはわかったんですが、xを増やしたときに変わっていくのをfor文でやっていくとTLEなんですよね。ちょっとやり方が思いつきませんでした。
馬を縞模様に塗ってシマウマにするという狂気にはツッコんでおきたい

問題と公式の解説のリンク

問題は以下のリンクから。

A - Octave -

問題

与えられた整数x,yから、xヘルツの音をyオクターブ上げると何ヘルツになるかを出力する問題。
なお音が1オクターブ上がるごとに周波数は2倍になります。

考え方とコード

yオクターブ上がるということは周波数xに2のy乗をかけたものになるので、その計算結果を出力。

x,y = map(int,input().split())
print(x*2**y)

B - Trifecta -

問題

nとn個の要素を持つ数列が与えられます。
n頭の馬がレースをし、数列の要素の値はi番目の馬のゴールまでの時間としたとき、1,2,3着の馬の番号を出力する問題。

考え方とコード

タイムが入った数列に番号を入れて、タイムで整列して戦闘から3つの番号を出力するとしました。

※ 2026/1/12追記
コードはより簡潔にできる気はします・・・
解説見て出力のための処理が恥ずかしくなったので修正しました。
(わざわざ3着までの番号を配列に入れてから出力してた)

n = int(input())
tmp = [int(x) for x in input().split()]

# タイムの数列に馬の番号を追加する
t = []
for i in range(n):
    t.append([tmp[i],i+1])

# ソートして着順に並べる
# 先頭から3着までの番号を抜き出して出力
t.sort(key=lambda x:x[0])
print(t[0][1],t[1][1],t[2][1])

--- 2026/1/12 C問題追記 ---
公式放送での解説を踏まえてC問題のコードを作成したのでまとめます。

C- Striped Horse -

問題

n個のマスと正整数wが与えられます。n個のマスのうち以下の条件を満たすマスを塗るとします。マスごとに塗るためのコストが与えられているとして、塗るコストの合計の最小値を出力する問題

  • 任意の正整数xを選んだときに、i番目のマスは$(i+x) % (w*2) < w$を満たす場合に塗;ル

なお、上記を1つのテストケースとして、入力は複数のテストケースがまとめて与えられます。

考え方とコード

まず以下の条件があり、塗るマスはxが1つ増えるごとに1つずつ右にずれていきます。

  • xを固定したときに、i番目は1マスごとに1増えることとw*2で割った余りを求めることから、計算結果は0からw*2-1の値を循環する
  • 仮に上記のxに1を足すと、i番目の計算結果は+1され、w*2となったマスのあまりは0になる。つまり計算結果は左に1ずれる形となる

そこで、まずはx=w*2(実質0)のときのコストの合計を計算し、次にxを1ずつ増やすときに対象じゃなくなるマスのコストを引いて新しく塗るコストを足すということをすれば全部のコストを確認することができ、その中から最小値を記憶して出力すればよいとなります。

for _ in range(int(input())):
    n,w = map(int,input().split())
    c = [int(x) for x in input().split()]
    w2 = w * 2
    
    cost = [0] * (w2)
    
    # x= w * 2のときの余りごとに加算されるコストの合計値をまとめる 
    for i in range(n):
        cost[i%(w2)] += c[i]
    
    # 後々の計算のために長さを2倍しておく
    for i in range(w2):
        cost.append(cost[i])

    # x= w * 2のときのコストを算出
    sum = 0    
    for i in range(w):
        sum += cost[i]
    ans = sum

    # xをw*2-1まで変化させたときのコストの変化を反映しつつ、最小コストを探す
    for i in range(w2):
        sum -= (cost[i] - cost[i+w])
        ans = min(ans,sum)
    
    print(ans)

--- 追記ここまで ---

2026年の目標はAtCoderで入緑すること、並行してデータ分析にも少し手を出して、kaggleかSIGNATEのコンペデビューをすることです。
ではでは。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?