期間は6ヶ月(25週間)とし、水色コーダーを目指します。
C・D問題攻略のためアルゴリズム別学習を進めます。
今週学習したこと
アルゴリズムの分野別学習を進めました。
・全探索の問題を10問
・「Pythonプロフェッショナル大全」を学習
さらに@e869120さんの記事で分野別学習を始めました。
レッドコーダーが教える、競プロ・AtCoder上達のガイドライン【中級編:目指せ水色コーダー!】
基本アルゴリズム12個を学ぶと良いようです。
各記事ボリュームがありますが、まずは12個基本を押さえます。
全探索 | 二分探索 | 深さ優先探索 (DFS) | 幅優先探索 (BFS) |
動的計画法 (DP) | ダイクストラ法 | ワーシャルフロイド法 | クラスカル法 |
高速な素数判定法 | べき乗を高速に計算する手法 | 逆元を計算する手法 | 累積和 |
問題を素直に実装すれば解ける問題(全探索)をコンテストで解けていないように感じたので、全探索の練習をしました。
レッドコーダーが教える、競プロ・AtCoder上達のガイドライン【初級編:競プロを始めよう】の「全探索の問題」を解きました。
ビット全探索と順列全探索が残っていますので、来週進めます。
また、競プロの内容ではないですがこちらの本を学習しました。
サンプルコード付きで内容がわかりやすく、応用の内容も盛りだくさんで満足度の高い本でした。
筆者の学習歴
学習歴はこんな感じです。
・利用言語はPython3
・Pythonの利用は業務で少し
・学習は「みんなのPython」を読んだくらい
・ABCコンテストには数回参加した(解けるのは1〜2問)
競プロではC++を使う方が多いかと思いますが、筆者はPythonのシンプルさに感動したためPythonで取り組みます。
今日が2022年8月21日(日)で、9月20日までの半年の期間で学習を進めます。
毎週のAtCoder Beginner Contest(ABC)をペースメーカーにしていきます。
今週のコンテスト
ARC146
まずARCに参加してきました。
1問AC、緑色パフォーマンスでした。
A問題だけ解けると判断し、A問題に取り組みました。
AC:1問
パフォーマンス:1010
レーティング:304→389(+85)
段級位:9級
結果
Three Cards
数字が書かれたN枚のカードから3枚を選び、3つの数を繋げてできる数のうち、最大のものを出力せよ。
21分30秒でACしました。
N=int(input())
A=list(map(int,input().split()))
A.sort(reverse=True)
a=str(A[0])
b=str(A[1])
c=str(A[2])
#print(a,b,c)
s=[]
s.append(a+b+c)
s.append(a+c+b)
s.append(b+a+c)
s.append(b+c+a)
s.append(c+a+b)
s.append(c+b+a)
s=[int(i) for i in s]
print(max(s))
素直に調べると、2*10**5の3重ループになるのでTLEします。
N個の数から大きい順に3個選び、繋げてできる数を全通り(6通り)調べれば良いことに気づきました。
B問題以降は手が出なかったので解かずに終了しました。
緑パフォーマンスは望外の結果でした。
ABC265
続いてABCに参加してきました。
3問AC、茶色パフォーマンスでした。
A、B、C問題を解き切りました。
AC:1問
パフォーマンス:418
レーティング:389→392(+3)
段級位:9級
結果
APPLE
X円で1個、Y円で3個のりんごを買える。最小の金額でちょうどN個のりんごを買うにはいくら必要か。
4分30秒でACしました。
1個をX円で買うのと、3個をY円で買う効率を調べます。
3個づつ買うのが効率が良ければ、Nを3で割って買えるだけY円で買っていきます。
x,y,N=map(int,input().split())
if x*3>=y:
b=N//3
a=N-3*b
else:
a=N
b=0
print(a*x+b*y)
Explore
N個の部屋があり、最初持ち時間はTである。
次の部屋に行くには持ち時間Aiが必要で、T>Aiなら次の部屋に進める。
また、M個のボーナス部屋がありそこでは持ち時間がXi回復する。
部屋Nまで辿り着けるか判定せよ。
2RE含む49分(実質59分)でACしました。
「iの部屋に行くのにAi必要で、入室後持ち時間がXi回復する」→「i+1の部屋の持ち時間は(Ai+1-Xi)である」と処理しました。
M=0のときXの要素がないので x,y=[list(i) for i in zip(*xy)]
がエラーになることに気づかず2REしてしまいました。
N,M,T=map(int,input().split())
A=list(map(int,input().split()))
if M!=0:
xy=[map(int,input().split()) for _ in range(M)]
x,y=[list(i) for i in zip(*xy)]
#print(x)
for i in range(M):
A[x[i]-1]-=y[i]
go_ok=True
life=T
#for i in range(M):
#A[x[i]-1]-=y[i]
for i in range(N-1):
if life-A[i]>0:
life-=A[i]
#print(life)
else:
print('No')
exit()
print('Yes')
BeltConveyor
たてH、横Wのグリッドがある。
グリッドには’U’、’D’、’R’、’L’のどれかの文字が書かれていて、可能なら文字に従い上下左右のどれかに移動する。
最終的に移動する位置を出力せよ。
ただし、移動が終わらない(ループする)場合は’-1’を出力せよ。
85分時点でACしました。(所要35分)
H,W=map(int,input().split())
S=[]
for i in range(H):
S.append(list(input()))
#print(S)
i=0
j=0
flag=True
walk=[[0 for i in range(W)] for j in range(H)]
walk[0][0]=1
#print('0')
#print(walk)
while flag:
#print(walk)
if S[i][j]=='R':
if j!=W-1:
j=j+1
if walk[i][j]==1:
print('-1')
exit()
else:
walk[i][j]=1
else:
print(str(i+1)+' '+str(j+1))
exit()
if S[i][j]=='L':
if j!=0:
j=j-1
if walk[i][j]==1:
print('-1')
exit()
else:
walk[i][j]=1
else:
print(str(i+1)+' '+str(j+1))
exit()
if S[i][j]=='D':
if i!=H-1:
i=i+1
if walk[i][j]==1:
print('-1')
exit()
else:
walk[i][j]=1
else:
print(str(i+1)+' '+str(j+1))
exit()
if S[i][j]=='U':
if i!=0:
i=i-1
if walk[i][j]==1:
print('-1')
exit()
else:
walk[i][j]=1
else:
print(str(i+1)+' '+str(j+1))
exit()
残り時間はこの問題に取り組みました。
コードはかなり汚いです。
H,W<=500なので、素直に実装して解けると判断しました。
移動した場所をメモしておき、同じ場所を通れば’-1’を出力して処理を終了します。
次の目標
今回のコンテストは、ARCが緑色パフォーマンス(1010)、ABCが茶色パフォーマンス(418)でした。
成長を感じる結果でよかったです。
目標:茶色パフォーマンスを継続して出せるようにする
茶色昇級のため、目標を整理しました。
・A・B問題を高速で解く(理想5〜10分以内)
・C・D問題をどちらかあるいは両方解く
いよいよ茶色昇級が見えてきました。
最近のABCは幅優先探索が多いような気がするので、来週は幅優先探索の練習をします。