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

Atcoderに最近ハマっています。

Atcoderは国内最大の競技プログラミングのオンラインコンテストです。

パズル感覚で問題を解くのと、レーティングが数値で出るのが面白いですね。

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

筆者の学習歴

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

まだまだ入門と言う感じですね。

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

・利用言語はPython3

・Pythonの利用は業務で少し

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

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

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

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

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

今週学習したこと

今週からABC Problemsで過去問に取り組み始めました。

ABC ProblemsでA、B問題を中心に50問ほど解きました。

A問題はサクサクと進めるので、まずはA問題を全部解ききるように進めます。

学習内容

ABC ProblemsでA、B問題を80問(A:65問、B:15問)

次の目標

前回のコンテストで茶色パフォーマンス(669)は出せました。

この調子でパフォーマンスを出せれば、あと4~5回で茶色(400)に昇級できそうです。

茶色への昇級は見えてきたので、目標を更新しました。

 

目標:緑色パフォーマンス(800以上)を出す

 

緑色パフォーマンス獲得のため、目標を整理しました。

学習内容

・A・B問題を高速で解く(理想5〜10分以内)

・C・D問題をどちらかあるいは両方解く

まずはA・B問題を確実に解けるようにします。

C、D問題については簡単な場合両方、難しい場合はどちらかを解きます。

これで緑色パフォーマンスを取れる可能性があります。

今週のABC

ABCに参加してきました。

abc2534

2問AC、茶色パフォーマンスを出せました。

進歩を感じられて嬉しいですね。

abc255

ABC結果

AC:2問

パフォーマンス:631

レーティング:221→257(+36)

段級位:9級

結果

A問題

You should output ARC, though this is ABC

2整数r,cと、2行2列の行列Aが与えられる。

Aの要素Arcを出力せよ。

行列として受け取るやり方がわからず手こずりました。

6分40秒でAC。

r,c=list(map(int,input().split()))
grid = []
for i in range(2):
array = list(map(int, input().strip().split()))
grid.append(array)
#a = [int(input().split()) for i in range(2)]
print(grid[r-1][c-1])
B問題

 Light It Up

xy平面上にN人の人がいて、うちK人は明かりをもっている。

明かりが強さRの時、半径Rの円が照らされる。

N人全員が照らせれるような、最小のRを求めよ。

N人に対し、K人のうち一番近い人を選んで距離を更新します。

N,K<=1,000なので、全探索で良かったです。

10分けるほど考えてやり方が分からず断念。

(以下は後日ACしたコード)

N,K=list(map(int,input().split()))
A = list(map(int,input().split()))
xy = [map(int, input().split()) for _ in range(N)]
x, y = [list(i) for i in zip(*xy)]

cnt=[(3*10**5)**2]*N
#cnt=(3*10**5)**2

for i in range(N):
  for j in A:
    dis=abs((x[i]-x[j-1])**2+(y[i]-y[j-1])**2)
    cnt[i]=min(cnt[i],dis)

dist=max(cnt)
print(dist**0.5)
C問題

+-1 Operation

整数Xが与えられる。

Xを+1するか-1する操作を何回か行う。

Xが初項A、公差D、項数Nの等差数列Sに含まれるようにするため、行う最小の操作の数を求めよ。

残り時間はこの問題に取り組みました。

条件を整理して答えが計算できることに気づきました。

X,A,D,N=list(map(int,input().split()))
#s = [A+D*i for i in range(N)]

L=A+D*(N-1)
#cnt=10**19

if X< A and X>L:
  ans=min(abs(A-X),abs(L-X))
elif D==0:
  ans=abs(A-X)
else:
  ans=min(abs((X-A)%D),abs((X-A)%D-D))
  
print(ans)

ここは条件の整理に時間がかかり50分かけてACしました。

感想

A,C問題をACすることができました。

2ACでパフォーマンスが631だったので、少し難しめ?だったようです。

B問題は解きたかったですね。

来週学習すること

C、D問題以降も勝負できる様にするため、まずはAtCoder ProblemsでA、B問題を解ききります。

その後は、ソートやDPなど分野に絞って学習していきます。

・AtCoder Problems

コメントを残す

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