0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【AtCoder】Fortranを用いたABC297A - Double Clickの解説

Last updated at Posted at 2023-04-10

背景

  • 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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?