LoginSignup
0
1

More than 3 years have passed since last update.

F#でAtCoder ARC105(A~B)

Last updated at Posted at 2020-10-11

A - Fourtune Cookies

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

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を攻略できるようになるのが目標となります。

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