[AtCoder]AtCoder過去問を解く①[Ruby]

プログラミング

前回まででAtCoder Beginners Selectionの問題を時終わったので、今回からはひたすら過去問を解いていこうと思います。過去問はhttp://atcoder-scores.herokuapp.com/にあるものを解きます。

ABC042A – 和風いろはちゃんイージー/IrohaandHaiku

問題

日本の誇る美しいリズムとして、五七五というものがあります。いろはちゃんは五七五が大好きです。

3つの文節の並びの長さがそれぞれ 5,7,5となるようにこの順番で並んでいるとき、その3つの文節の並びは五七五であると言います。

並び替えたい3つの文節の長さを表す整数 A,B,Cが与えられるので、それらの文節を並び替えて五七五にできるか判定してください。

自分の回答

def irohaandhaiku(haiku)
  puts haiku.count(5) == 2 && haiku.count(7) == 1 ? "YES" : "NO"
end

haiku = gets.chomp.split(" ").map(&:to_i)
irohaandhaiku(haiku)

A問題なので、そこまで難しくないです。配列に、5が二つ、7が一つの時はYES、それ以外はNOとすればOKです。

ABC043A – キャンディーとN人の子供イージー /Children and Candies

問題

競プロ幼稚園にはN人の子供がいます。えび先生は、子供たちを一列に並べ、一人目にはキャンディーを1個,二人目には2個,…,N人目にはN個あげることにしました。必要なキャンディーの個数の合計は何個でしょう?

自分の回答

def childrenandcandies(child)
  candies = (1 + child)*child/ 2
  p candies
end

child = gets.chomp.to_i
childrenandcandies(child)

等差数列の問題です。初項(この問題の場合1)とn項(child)までの和は初項とn項を足したものに、nをかけて2で割ったものになります。等差数列を知っていれば簡単に解ける問題です。

余談

この等差数列の考え方は、天才数学者であるカール・フリードリヒ・ガウスさんが小学生の時に編み出したとして有名な話ですね。

数学だけでなく、ガウスの法則という物理学を学んだら必ず出てくるような有名な法則を発見した人でもあります。その他にも、ガウスと名の付く法則はたくさんあり、ガウスさんの功績は計り知れません。

ABC044A – 高橋君とホテルイージー/Tak and Hotels

問題

1軒のホテルがあります。 このホテルの宿泊費は、次のようになっています。

  • 最初のK泊までは、1泊あたりX円
  • K+1泊目以降は、1泊あたりY円

高橋君は、このホテルにN泊連続で宿泊することにしました。 高橋君の宿泊費は合計で何円になるか求めてください

自分の回答

def hotels(lodging_all, lodging_first, price_first, price_second)
  if lodging_all >= lodging_first
    lodging_second = lodging_all - lodging_first
    price_all = lodging_first * price_first + lodging_second * price_second
  else
    price_all = lodging_all * price_first
  end
  p price_all
end

lodging_all = gets.chomp.to_i
lodging_first = gets.chomp.to_i
price_first = gets.chomp.to_i
price_second = gets.chomp.to_i
hotels(lodging_all, lodging_first, price_first, price_second)

考慮しなければいけないのは、宿泊費が変わるK泊目よりも宿泊数Nが少ない時です。自分のコードで言うと、値段が変わった後の宿泊数(lodging_second)がマイナスになってしまうので、計算が合わなくなります。なので、K泊目が宿泊数Nを大きい時と小さい時で場合わけをすればいいのです。

タイトルとURLをコピーしました