ABC183参戦記

プログラミング

前回のABCで茶色から灰色に戻ってしまいました。

安定してC問題を解けるように、また、出来ればD問題も解けるようにしたいですね。

と思いつつも、最近は競プロの精進はあまりしていなくて、LineBotのコードをJSで書いてたりしてました。
競プロの勉強が進まないのは、DPの理解が進まなくてつらいからです。はい。言い訳です。

さて、今回で茶色に戻れるのか?時間をあまりかけずにCまで解けたら戻れるかな?と思いつつ参加したABC183の参加記録です。

Python3を使用した、灰色コーダーの私が自分が理解できる内容にまとめています。

A – ReLU

標準入出力と条件分岐の実装を問われる問題。

問題のタイトルになっているReLUは、活性化関数の一つみたいですね。機械学習系の記事で見たことある感じがするやつです。
それがわかっていなくても、問題文に書いてある通りに実装すればACできますね。

# AtCoder Beginner Contest 183
# A - ReLU

N=int(input())

if N>=0:
    print(N)
else:
    print(0)

標準入力の値も一つなので初めての方にも優しい問題だと思います。
A問題で1行に複数の入力があるものに慣れるのに私はすごく苦しみました。

B – Billiards

xy平面状での2点を結ぶ直線のx軸との交点を求める問題。

Gx,Gyのy座標を反転させて2点を通る直線を通る2次関数を求めて、y=0となるxが答えです。

# AtCoder Beginner Contest 183
# B - Billiards

Sx,Sy,Gx,Gy=map(int,input().split())
Gy=(-1)*Gy

ans=((Gx-Sx)*(0-Sy)/(Gy-Sy))+Sx
print(ans)

'''
xy平面状のS(Sx,Sy)とG(Gx,Gy)を通る直線を二次関数として表すと、
(Gx-Sx)(y-Sy)=(Gy-Sy)(x-Sx)
y=0の場合のxの値を知りたいので、yに0を代入し、xについて解くと上記の式になる。
'''

C – Travel

順列の操作と、配列のindexを適切に扱えるかを問われる問題。

まずは、訪れる都市のルートを作成します。

1を除く、(N-1)の都市について、順列を作成して、最初と最後に都市1を追加すればルートは出来上がります。

まずは1を除く(N-1)の都市の訪問順番をitertoolsのpermutationsで作成して、最初と最後に都市1を追加します。
注意点としては、都市1を除いているのと、配列は0indexなので、問題文と同じ条件にするには、permutationsで作成した訪問する都市には+2する必要があることだと思います。

これで都市1を出発して、各都市を巡って都市1に戻ってくるルートの作成は完了です。

あとは、都市iから都市jまでの移動時間を入力で受け取った配列から探して足し算していったものがKと一致したら答え用の変数(ans)に1加算して、最後にansを出力すればOKです。
ここでまた、indexの取り扱いに注意が必要で、先ほど、問題文中の都市の番号と合わせていますが、配列は0indexなのでそこを間違えないようにしないとダメですね。

# AtCoder Beginner Contest 183
# C - Travel

import itertools

N,K=map(int,input().split())

Tls=[]
for i in range (N):
    t=list(map(int,input().split()))
    Tls.append(t)

ans=0

v=list(itertools.permutations(range(N-1)))
for i in range (len(v)):
    D=v[i]
    path=[1]
    time=0
    for j in range(len(D)):
        path.append(D[j]+2)
    path.append(1)
    # print(path) // 都市を巡回するルートを確認
    for k in range(len(path)-1):
        time+=Tls[path[k]-1][path[k+1]-1]
    if time==K:
        ans+=1
print(ans)

今回はCまでを解けて無事茶色に戻れました!

コメント

タイトルとURLをコピーしました