競技プログラミングとは? やってみよう!
競技プログラミングをやる機会があったんですが、全然できなくて悔しかったので少し勉強していこうかなと思います笑
競技プログラミングは問題をプログラミングで解いていくことです。
アルゴリズムを鍛えることができるので、やって損はないかなと思います。
調べると「ArCoder」が競技プログラミングのサイトでは有名みたいなので、これを使って勉強していきます!
A問題が一番簡単みたいなのでやってみましたが、個人的にはかなり難しかったです、、
今回は下記の問題をRubyで解いてみましたー!言語はなんでも大丈夫です。
問題文
高橋君は 枚の AtCoder せんべいを 人の AtCoder 参加者になるべく公平に配ることにしました。 枚すべてのせんべいを配るとき、せんべいを最も多くもらった人と最も少なくもらった人のもらったせんべいの枚数の差(の絶対値)の最小値を求めてください。
制約
- 入力はすべて整数である
入力
入力は以下の形式で標準入力から与えられる。
出力
せんべいを最も多くもらった人と最も少なくもらった人のもらったせんべいの枚数の差(の絶対値)の最小値を出力せよ。
詳しくは下記リンクを見てください。
ちなみに自分はわからなかったので答えをみてしまいました笑
せっかくなのでRubyの答えと解説をしていきます。
まずは N K の入力ができるようにします。
n, k = gets.split.map(&:to_i)
これで 2 2 みたいに空白で区切って数字を入力することができるようになりました。
次にどうやって出力していくかですね。
出力
せんべいを最も多くもらった人と最も少なくもらった人のもらったせんべいの枚数の差(の絶対値)の最小値を出力せよ。
例です。
12枚のせんべいと5人だった場合は公平に分けるので
せんべい 3 3 2 2 2
ひと 人 人 人 人 人
差は1枚ですね。
9枚のせんべいと3人だった場合は
せんべい 3 3 3
ひと 人 人 人
差は0枚です。
7枚のせんべいと4人だった場合は
せんべい 2 2 2 1
ひと 人 人 人 人
差は1枚です。
差は2枚以上になることはありません。
何故かというと
8枚のせんべいと3人だった場合は
せんべい 2 2 4
ひと 人 人 人
これでは差が2枚以上ですが、条件としてなるべく公平に配るので、このパターンは存在しません。
以下のようになります。
せんべい 2 3 3
ひと 人 人 人
差は1枚です。
つまり、差は0か1です。
これを考えると以下のように表現できます。
puts (n % k == 0) ? 0 : 1
n枚➗k人の余りが0だったら差は0
逆に余りがでたら差は1
なので答えは
n, k = gets.split.map(&:to_i)
puts (n % k == 0) ? 0 : 1
他にも答え方はあると思います。
やってみて楽しかったので、できるときに問題を解いていきたいですね〜