099 B - Simplified mahjong¶
- created: 2022-12-25 sun
- ご意見・ご要望はissue・プルリク用のGitHubまで
- 競技プログラミングのためのF#入門
- GitHub上の対応ディレクトリ
- 公式ページ
- 要点: アルゴリズムの検討
入出力¶
1 2 3 | |
解説¶
方針¶
公式解説とは違い, 次の方針で前から順に計算します.
- 各
iごとに自分自身でペアを作れるだけ作る. - 各
iごとにあまりは一枚出るか出ないかで, これを次に持ち越す. - 前の
iであまりがあった場合は, 積み残しとのペアを考えつつ自分自身でペアを作れるだけ作る.
次のfoldで素直に処理できます.
1 2 3 | |
accがペアの数を積む変数でmがあまりの有無を表します. 最後に必要なのはペアの数を表すタプルの第一変数だからfstで切り出します.
fold内の条件分岐¶
まずあまりがなかった場合はごく単純に次のように書けます.
1 | |
次の二つはあまりがないときの分岐です. まず入力のA_iが0の場合はペアを作りようがないためそのまま次に回します.
1 | |
今度は入力のA_iが非零の値を持つため, 前からの積み残しの分を考えて計算します.
1 | |
積み残しと一つペアを作るため, 次に積み回すための商とあまりのq,rはa-1から計算します. さらにa-1で計算した以上ペアがもう一つできているためペアのカウントはacc+q+1で+1が必要です.
まとめ¶
1 2 3 4 5 6 7 8 9 10 11 | |