背景
- AtCoder Beginner Contest 297に参加しました。
- 自身のプログラミング技術の向上と、Fortranの発展を願って投稿します。
(Fortran使ってる人が6000人中2人でした。かなしい。) - B問題とC問題はこちら。(記事が長くなるので分けました)
実行環境
- Macbook(M1)
- Docker
- VsCode
- Fortran(gcc version 10.2.1)
問題内容
問題文はこちらです。
いろいろ書いてありますが、内容は次のとおりです。
N回
存在する以下の様なマウスの入力時刻に対して、ダブルクリックが1つでも成立しているか
を調べます。
T_1,T_2,T_3 ... T_N
ダブルクリックの成立は、前後のマウスのクリック時間Tが判定時間D以下
であるかを見て判断します。式にすると以下の様になります。
T_i+1 -T_i <= D
ダブルクリックが1度でも成功していれば、その時間を出力します。
一度も成立していなければ、-1を出力します。
解説ポイント
基本的な考え方は、公式の解説(C++)の通りとなります。
以下はFortranでのポイントです。
-
マウスのクリック数はN回となっており、サイズが分かりません。
従って、allocatable属性
を用いて動的に配列を割り当てます。 -
ダブルクリック判定は、
do文
を用いて隣り合う数字を調べることで行います。 -
一度でもダブルクリック判定があれば残りは不要なので、
stop
を用いて処理を終了させます。 -
do文が全て回って次の処理に移った場合、該当箇所なしとなり-1を出力します。
-
do文で調べる範囲は、
1からN-1
になります。N番目は後ろがないので不要です。 -
出力は左詰め
が指定されています。従って、書式を指定する必要があります。
サンプルコード
program A
implicit none
integer::N, D, i
integer, allocatable :: T(:)
read *, N, D
allocate (T(N))
read *, T
do i = 1, N - 1, 1
!print *, T(i + 1), '-', T(i), '=', T(i + 1) - T(i)
if (T(i + 1) - T(i) <= D) then
write (*, "(i0)") T(i + 1)
stop
end if
end do
write (*, "(i0)") - 1
end program A