はのちゃ爆発

はのちゃが技術ネタとか日常のこととかを書いてます。

ABC 052 参加したメモ

ABC 052 = AtCoder Beginner Contest 052 です。

前回の年始ABC参加メモ書いてないけど、あれは開発合宿の一部でやったし後で書く。

A - Two Rectangles

二つの四角形(長方形)があるとき、大きいほうの面積を出力する問題。

arr = gets.chomp.split.map(&:to_i)
puts arr[0] * arr[1] >= arr[2] * arr[3] ? arr[0] * arr[1] : arr[2] * arr[3]

なんかもうちょっときれいに書けそうな気はする。

B - Increment Decrement

インクリメント/デクリメントを繰り返した時の最大値を求める問題。 地味に躓いた。'I', 'D' で構成された文字列を配列にするところで。

…って今書いてて気づいたけど、これ s.each do ... でいいじゃん。ハズカシー

戒めとして提出コードは残しておきます。

n = gets.chomp.to_i
s = gets.chomp.split(//)
x, max = 0, 0
 
n.times do |i|
  x += 1 if s[i] == 'I'
  x -= 1 if s[i] == 'D'
  max = x if x > max
end
 
puts max

C - Factors of Factorial

解けなかった。

ある整数Nの階乗N!がいくつの約数を持つかを答える問題。

考え方はあってた。与えられたNから順番に素因数分解していった結果をどっかに持っておいて、 素因数分解の結果から約数の数を求める公式に突っ込むという愚直な方法でよかった。

前回といい今回といい、愚直に求める系の問題が苦手すぎてアカン…

D - Walk and Teleport

Cを一旦やめてDを先にやったのは正解だった。

(こっちのほうがCより簡単なのでは…と思わなくもない)

東西に伸びる直線状にN個の町があり、「徒歩」と「テレポート」を使い分けてすべての町を最短コストで回りたい、という問題。

これまた each 案件だったような…まあいいや…

なんか難しく考えすぎていた。シンプルに順番に徒歩かテレポートかを判断していくだけでよかった。

n, a, b = gets.chomp.split.map(&:to_i)
towns = gets.chomp.split.map(&:to_i)
distances = []
pos, total = 0, 0
 
(n-1).times do |i|
  distances[i] = towns[i+1] - towns[i]
end
 
(n-1).times do |i|
  if a * distances[pos] < b
    total += a * distances[pos]
    pos += 1
  else
    total += b
    pos += 1
  end
end
 
puts total

まとめ

愚直にやるのも大事。