shiki0331’s blog

Web Developer. TypeScript / React.js を中心に学んでいます。 ブログ内容で間違っている箇所などありましたら、ご指摘していただけると助かります。

競技プログラミングとは? やってみよう!

競技プログラミングをやる機会があったんですが、全然できなくて悔しかったので少し勉強していこうかなと思います笑

 

競技プログラミングは問題をプログラミングで解いていくことです。


アルゴリズムを鍛えることができるので、やって損はないかなと思います。

 

調べると「ArCoder」が競技プログラミングのサイトでは有名みたいなので、これを使って勉強していきます!


A問題が一番簡単みたいなのでやってみましたが、個人的にはかなり難しかったです、、

 

今回は下記の問題をRubyで解いてみましたー!言語はなんでも大丈夫です。

 

問題文

高橋君は N 枚の AtCoder せんべいを K 人の AtCoder 参加者になるべく公平に配ることにしました。 N 枚すべてのせんべいを配るとき、せんべいを最も多くもらった人と最も少なくもらった人のもらったせんべいの枚数の差(の絶対値)の最小値を求めてください。

制約

  • 1N,K100
  • 入力はすべて整数である

入力

入力は以下の形式で標準入力から与えられる。

N K

出力

せんべいを最も多くもらった人と最も少なくもらった人のもらったせんべいの枚数の差(の絶対値)の最小値を出力せよ。

詳しくは下記リンクを見てください。

atcoder.jp

 

ちなみに自分はわからなかったので答えをみてしまいました笑

 

せっかくなので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

 

他にも答え方はあると思います。

 

やってみて楽しかったので、できるときに問題を解いていきたいですね〜