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

## A - tcdr
### 問題
英小文字からなる文字列 S が与えられます。
S から __a, e, i, o, u__ をすべて取り除いて得られる文字列を出力してください。

>**制約**
>1. S は英小文字からなる長さ 1 以上 100 以下の文字列
>2. S は a, e, i, o, u 以外の文字を一つ以上含む

詳細はこちらです。

https://atcoder.jp/contests/abc315/tasks/abc315_a


### 解説
**【フローチャート】**
Sを１文字ずつ調べ、 **a, e, i, o, u** に該当しない場合は出力します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3259514/244ef555-76a9-f6f3-bdb8-d9b72fb6adb1.png" width=45%>

**【補足】**
※1
if文を使い、 __a, e, i, o, u__ のいずれかに該当するか調べます。
__a, e, i, o, u__ のいずれかに該当する場合ステップを進め、次の文字を調べます。

※2
__a, e, i, o, u__　のいずれかに該当しない場合、対象文字を出力します。
１文字ずつ出力し文字列を構成したいので、改行は行いません。
write文に`advance='no'`を追加し、改行を行わない様にします。


### プログラム例
```Fortran
program ABC315a
    implicit none
    integer i
    character(100) :: S

    !入力
    read (*, *) S

    !判定
    do i = 1, len(S)
        if (S(i:i) == 'a') cycle
        if (S(i:i) == 'e') cycle
        if (S(i:i) == 'i') cycle
        if (S(i:i) == 'o') cycle
        if (S(i:i) == 'u') cycle
        write (*, '(a)', advance='no') S(i:i)
    end do
end program abc315a
```



## B - The Middle Day
### 問題
AtCoder 国の1年は M か月、i 番目の月は $D_i$ 日です。
１年の真ん中の日は、何月何日かを求めてください。

>**制約**
>1. 入力は全て整数
>2. $1≤M≤100$
>3. $1≤D_i​≤100$
>4. $D_1+D_2+⋯+D_M$ は奇数

詳細はこちらです。

https://atcoder.jp/contests/abc315/tasks/abc315_b


### 解説
**【フローチャート】**
１年の真ん中の日の**累計日数**を計算し、1月から順番に該当するか調べます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3259514/a076685a-baec-31c4-37a7-85c4db200147.png" width=40%>


**【補足】**
※1
$D_1 ,D_2,...,D_M$を累計し、１年間の日数を計算します。
１年間の日数の計算には、`Do文`を使います。

※2
真ん中の日が含まれる月を調べます。
年始から真ん中の日までの累計日数に、各月の日数$D_i$を引いていき、その結果(残日数)が次の月の日数$D_{i+1}$以下かどうかで判定を行います。


### プログラム例
```Fortran
program ABC315b
    implicit none
    integer i
    integer M, sum, ave
    integer(4), allocatable ::D(:)
    !初期化
    sum = 0; ave = 0

    !入力
    read (*, *) M
    allocate (D(M))
    read (*, *) D(:)

    !１年の日数の計算
    do i = 1, M
        sum = sum + D(i)
    end do
    ave = (sum + 1)/2

    !真ん中の日数を調べる
    do i = 1, M
        if (ave - D(i) > 0) then
            ave = ave - D(i)
        else
            write (*, *) i, ave
            stop
        end if
    end do
end program abc315b
```



## C - Rotate Colored Subsequence
### 問題
N カップのアイスクリームがあります。
i カップ目の味は $F_i$、美味しさは $S_i$​ です。
 N 個のカップの中から 2 つを選んで食べるとき、満足度が最大になる組み合わせを求めます。
満足度の計算は以下に示す通り行われます。

>**満足度の計算**
>1.  食べたアイスクリームの美味しさを$S_1,S_2(S_1>S_2)$ とする。
>2.  2つのカップの味 $F_1,F_2$ が**異なる**なら、満足度は $S_1+S_2$ である。
>3.  2つのカップの味 $F_1,F_2$ が**同じ**なら、満足度は $S_1+S_2/2$ である。


>**制約**
>1. 入力は全て整数
>2. $2≤N≤3×10^5$
>3. $1≤F_i≤N$
>4. $2≤S_i≤10^9$
>5. $S_i$は偶数

詳細はこちらです。

https://atcoder.jp/contests/abc315/tasks/abc315_c


### 解説
**【注意点】**
- $2≤N≤3×10^5$であるため、総当たりで満足度を調べると、**TLE**となってしまします。

**【フローチャート】**
全てのアイスの中から一番おいしいアイスを調べ、食べる1つ目のアイスを固定します。
食べる2つ目のアイスを総当たりで変え、満足度の最大値を調べます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3259514/585ebe27-f349-e3af-de60-2b2d5e96b608.png" width=80%>

**【補足】**
※1
N,F,Sの入力に合わせて、全てのアイスの中から一番おいしいアイスを調べます。
一番美味しいアイスの$F_{max},S_{max}$を記録します。

※2
食べる1つ目のアイスを一番美味しいアイスに固定した状態で、2つ目のアイスを総当たりで調べます。
読み出しアイスの味$F_i$が、1つ目に食べたアイス(一番美味しいアイス)の味$F_{max}$と同じかどうかを調べます。

※3
満足度の計算を行います。
計算は読み出しアイスの味$F_i$が、1つ目に食べたアイス(一番美味しいアイス)の味$F_{max}$と同じかどうかによって異なります。


### プログラム例
```Fortran
program ABC315c
    implicit none
    integer(16) i
    integer(16) N, max_i, max_S, max_F, azi, max_azi
    integer(16), allocatable ::F(:), S(:)
    !初期化
    max_i = 0; max_S = 0; max_F = 0

    !入力
    read (*, *) N
    allocate (F(N), S(N))
    do i = 1, N
        read (*, *) F(i), S(i)
        if (max_S < S(i)) then
            max_i = i
            max_S = S(i)
            max_F = F(i)
        end if
    end do

    !最大値の検索
    do i = 1, N
        if (i == max_i) cycle
        if (max_F == F(i)) then
            azi = max_S + S(i)/2
        else
            azi = max_S + S(i)
        end if
        max_azi = max(max_azi, azi)
    end do

    !結果の出力
    write (*, '(i0)') max_azi
end program abc315c
```


## 感想
- **ABC316は公式でスキップされるため、次回更新はABC317になります。**
- C問題について、ソートを使った整理を行う実装で進めていました。解答例を見て、1個目を最大値で固定し、２個目を総当たりで調べればいいことを後で知り愕然としました。
    - 根本的な発想力が足りておらず、勉強方法を変える必要があると感じました。