競技プログラミングのためのF#入門
公式解説通りに素直に実装します.
今回入出力は次のように処理する前提で解説します.
1 2 3 |
|
降順ソートはArray.sortDescending
とArray.sortByDescending
があり, 今回は後者を使えばよいでしょう.
次は和を取る部分です. 配列はF#流の0
はじまりとします. 公式解説では別途b_i
の和を取っておくような形になっていました. しかし配列の添字が偶数ならa_i
を, 奇数なら-b_i
を足すようにすればb_i
の和を別途用意する必要はありません.
問題は配列の添字をどう用意するかです. Array.indexed
で元の配列Xa
を添字づけてから処理する方法もあれば, 添字の配列でArray.fold
やArray.sumBy
を回す方法もあります. ここでは次のようにArray.fold
で添字を積む方法を取ります.
1 2 3 4 5 |
|
Array.fold
で持ち回る変数として和のacc
だけではなく添字のi
も積みます. 添字にあたるi
を削るため最後にfst
で和だけを取っています.
Array.fold
に食わせるラムダでlet c = hoge in
を使っています. let in
をうまく使うと一行でも見やすく書けて便利です. もちろん二行に分けて書いても構いません.