【AtCoder22週目】競プロ初心者が6ヶ月で水色コーダー目指す学習記

期間は6ヶ月(25週間)とし、水色コーダーを目指します。

C・D問題攻略のためアルゴリズム別学習を進めます。

今週学習したこと

アルゴリズムの分野別学習を進めました。

学習内容

・全探索の問題を10問

・「Pythonプロフェッショナル大全」を学習

さらに@e869120さんの記事で分野別学習を始めました。

レッドコーダーが教える、競プロ・AtCoder上達のガイドライン【中級編:目指せ水色コーダー!】

基本アルゴリズム12個を学ぶと良いようです。

各記事ボリュームがありますが、まずは12個基本を押さえます。

全探索 二分探索 深さ優先探索 (DFS) 幅優先探索 (BFS)
動的計画法 (DP) ダイクストラ法 ワーシャルフロイド法 クラスカル法
高速な素数判定法 べき乗を高速に計算する手法 逆元を計算する手法 累積和

問題を素直に実装すれば解ける問題(全探索)をコンテストで解けていないように感じたので、全探索の練習をしました。

レッドコーダーが教える、競プロ・AtCoder上達のガイドライン【初級編:競プロを始めよう】の「全探索の問題」を解きました。

ビット全探索と順列全探索が残っていますので、来週進めます。

zentansaku-22

また、競プロの内容ではないですがこちらの本を学習しました。

サンプルコード付きで内容がわかりやすく、応用の内容も盛りだくさんで満足度の高い本でした。

筆者の学習歴

学習歴はこんな感じです。

筆者の競技プログラミング歴

・利用言語はPython3

・Pythonの利用は業務で少し

・学習は「みんなのPython」を読んだくらい

・ABCコンテストには数回参加した(解けるのは1〜2問)

競プロではC++を使う方が多いかと思いますが、筆者はPythonのシンプルさに感動したためPythonで取り組みます。

今日が2022年8月21日(日)で、9月20日までの半年の期間で学習を進めます。

毎週のAtCoder Beginner Contest(ABC)をペースメーカーにしていきます。

今週のコンテスト

ARC146

まずARCに参加してきました。

ARC146

ARC146

1問AC、緑色パフォーマンスでした。

A問題だけ解けると判断し、A問題に取り組みました。

ARC結果

AC:1問

パフォーマンス:1010

レーティング:304→389(+85)

段級位:9級

結果

A問題

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に参加してきました。

ABC265

ABC265

3問AC、茶色パフォーマンスでした。

A、B、C問題を解き切りました。

ARC結果

AC:1問

パフォーマンス:418

レーティング:389→392(+3)

段級位:9級

結果

A問題

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)
B問題

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')
C問題

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は幅優先探索が多いような気がするので、来週は幅優先探索の練習をします。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です