A - Fourtune Cookies
let inputs = stdin.ReadLine().Split() |> Array.map int64
let s = inputs |> Array.sum
let rec solve i =
let eat = [for j=0 to inputs.Length-1 do if i>>>j&&&1 = 1 then inputs.[j]] |> List.sum
let s' = s - eat
if i-1 >= (pown 2 4) then false
elif s'=eat then true
else solve (i+1)
if solve 1 then "Yes" else "No"
|> stdout.WriteLine
全探索でやりました。
解説を読むとソートしておけば2パターンに絞れるのでそもそもループする必要性がないみたいですね。
B - MAX-=min
let N = stdin.ReadLine() |> int64
let a = stdin.ReadLine().Split() |> Array.map int64
let rec gcd x y =
if y=0L then x
else gcd y (x%y)
Array.fold gcd a.[0] a.[1..]
|> stdout.WriteLine
要素全ての最大公約数が答えになることに気づければ簡単でした。こういった解法に気づければ短いコードで済むタイプの問題は好きです(解けるとは言っていない)。
提出する前、gcdの関数で何故かスタックオーバーフローを繰り返してて困っていたのですが、なんてことはなく
gcd y x%y // 関数gcdの引数にxとyを渡して得られた戻り値をyで割った余りを出す(多分
このように書いていた為でした。
F#は大抵の場合コンパイラがはじいてくれるのですが、こういった括弧に気を遣う必要があるのはちょっとネックです。
終わりに
AとBを何とか解くことができましたが、B提出までに1時間かかってしまいました。
当面はARCならBまでを、ABCならCまでをできるだけ素早く安定して解けるようになりたいところ。まだ灰色ですが、茶とそれ以降で大きな壁らしいARCならC、ABCならDを攻略できるようになるのが目標となります。