1
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.

【ABC320】FortranでA,B,C問題

Posted at

A - Leyland Number

問題

正整数
A,B が与えられます。
$A^B+B^A$の値を出力してください。

制約

  1. $2≤A≤B≤9$
  2. 入力される数値はすべて整数

詳細はこちらです。

解説

【フローチャート】
入力に従い$A^B+B^A$を計算します。

プログラム例

program abc320a
    implicit none
    integer A, B, Ans

    read (*, *) A, B
    Ans = A**b+B**A
    write(*,*)Ans

end program abc320a

B - Longest Palindrome

問題

文字列$S$が与えられます。 $S$の連続する部分文字列のうち、回文であるものの長さの最大値を求めてください。

制約

  1. $S$は長さ$2$以上$100$以下の英大文字からなる文字列

詳細はこちらです。

解説

【フローチャート】

長いので折りたたみます

【補足】
※1
回文の検証に使用したい範囲を超過していないかを判定します。

入力する文字列の長さは1〜100文字なので、格納用の配列$S$は100文字分用意しています。
入力時に余った部分は空白が入ります。

回文の検証に使用したい範囲は文字が格納されている箇所までなので、
$S(i:i)$に空白が格納されている時点で処理を終了させます。

※2
回文が成立しているかを判定します。
判定は、$S(i:i)$ を中心に置き、そこから左右に1文字ずつ文字が一致しているかを調べます。

判定する順番のイメージ
$4,3,2,1,S(i:i),1,2,3,4$

※3
回文が成立している最大の長さを更新します。
最大値の比較にはMAX関数を使用します

※4
回文の検証に使用したい範囲を超過していないかを判定します。

回文の検証に使用したい範囲は文字が格納されている箇所までなので、
$S(i:i)とS(i+1:i+1)$に空白が格納されている時点で処理を終了させます。

※5
回文が成立しているかを判定します。
判定は、中心に文字を置かずに、左右に1文字ずつ文字が一致しているかを調べます。

判定する順番のイメージ
$4,3,2,1,1,2,3,4$

プログラム例

program abc320b
    implicit none
    integer i, j, length, cnt
    character(100) S

    !読み込み
    read (*, *) S

    !回文の長さ測定
    length = 1
    do i = 1, len(S)
        cnt = 1
        if (S(i:i) == '') exit
        do j = 1, len(S)
            if (i - j < 1 .or. i + j > len(S)) exit
            if (S(i - j:i - j) /= S(i + j:i + j)) exit
            cnt = cnt + 2
        end do
        length = max(length, cnt)

        if (S(i:i) == S(i + 1:i + 1)) then
            cnt = 2
        else
            cycle
        end if
        do j = 1, len(S)
            if (i - j < 1 .or. i + j + 1 > len(S)) exit
            if (S(i - j:i - j) /= S(i + j + 1:i + j + 1)) exit
            cnt = cnt + 2
        end do
        length = max(length, cnt)
    end do

    !結果の出力
    write (*, '(i0)') length
end program abc320b

C - Slot Strategy 2 (Easy)

問題

数字のみで構成される長さ M のリールが 3 個からなるスロットがあります。

スロットが回り始めてからちょうど t 秒後にボタンを 1 つ選んで押す、または何もしないことができます。
ボタンを押した場合は $mod(t,M)+1$ 文字目を表示して止まります。

全てのリールを同じ数字で止めるためには、最小で何秒かかるかを求めてください。

制約

  1. $1≤M≤100$
  2. M は整数
  3. S_iは数字のみからなる長さ M の文字列

詳細はこちらです。

解説

【フローチャート】

長いので折りたたみます

【補足】
※1
リールを止める時間は mod により制御されるため、M 秒で結果が1周します。
M+1 秒以降は調べる必要はありません。

1 つのリールと止める時間の最大は 100秒(M=100)なので、0〜300 秒まで調べれば3つのリールの全てのパターンを調べることができます。

※2
1度に止められるリールは1つです。
同時に複数のリールを止めることはないので、$t1=t2,t2=t3,t1=t3$の時はcycle文により処理を飛ばします。

※3
全てのリールが一致している場合、経過時間の最小時間を更新します。
経過時間は t1 , t2 , t3 のうち、一番最後に止めた時間になります。

プログラム例

program abc320c
    implicit none
    integer M, t1, t2, t3, tmp(3), ans
    character(:), allocatable:: S(:)
    character(1) slot(3)

    !読み込み
    read (*, *) M
    allocate (character(M):: S(3))
    read (*, *) S(1)
    read (*, *) S(2)
    read (*, *) S(3)

    !スロットを回す
    ans = 777777777
    do t1 = 0, 300
        tmp(1) = mod(t1, M) + 1
        slot(1) = S(1) (tmp(1):tmp(1))
        do t2 = 0, 300
            if (t1 == t2) cycle
            tmp(2) = mod(t2, M) + 1
            slot(2) = S(2) (tmp(2):tmp(2))
            if (slot(1) /= slot(2)) cycle
            do t3 = 0, 300
                if (t1 == t3) cycle
                if (t2 == t3) cycle
                tmp(3) = mod(t3, M) + 1
                slot(3) = S(3) (tmp(3):tmp(3))
                if (slot(2) /= slot(3)) cycle
                ans = min(ans, max(t1, t2, t3))
            end do
        end do
    end do

    !結果の出力
    if (ans == 777777777) then
        write (*, '(i0)') - 1
    else
        write (*, '(i0)') ans
    end if
end program abc320c

感想

  • 回文の問題に苦戦しました。苦手なので回文用のサブルーチンを作っておきたい。
1
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
1
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?