0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

RubyでAtCoder ABC308(A, B, C)を解いてみた

Posted at

はじめに

Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC308のA, B, Cを解きました。備忘録として解き方をまとめていきたいと思います。

A - New Scheme

a-308.rb
s = gets.split.map(&:to_i)
puts s == s.sort && s.all?{ 100 <= _1 && _1 <= 675 && _1 % 25 == 0} ? "Yes" : "No"

B - Default Price

b-308.rb
n, m = gets.split.map(&:to_i)
c = gets.split
d = gets.split
a = gets.split.map(&:to_i)

b = a.shift
hash = d.zip(a).to_h
puts c.map{ 
  hash[_1] ? hash[_1] : b
}.sum

解説

最初に、dとaの長さを揃えるためにshiftメソッドを使ってaの先頭の要素を取り出し、これをbとしておきます。次に、zipメソッドを使ってdとaの各要素からなる配列をもとに連想配列を作ります。最後に、cの各要素に対してその色がhashに含まれているかどうかにより値を変更した後、その総和を求めることで解くことができます。

C - Standings

c-308.rb
n = gets.to_i
$array = Array.new(n){ gets.split.map(&:to_i) }

def f(i, j)
  return $array[i][j]
end

def function_p(s, t, r)
  return s * (t + r)
end

result = [*1..n].sort! { |i, j|
  i -= 1
  j -= 1
  a1, b1 = f(i, 0), f(i, 1)
  a2, b2 = f(j, 0), f(j, 1)

  p1, p2 = function_p(a1, a2, b2), function_p(a2, a1, b1)

  p1 == p2 ? i <=> j : p2 <=> p1
}
puts result.join(" ")

解説

(他の方の提出結果を参考にしました)

誤差を考慮して、分母を払った状態で計算します。このとき、確率が等しければi<=>jでインデックスの大小を比較し、そうでなければp2<=>p1で各要素の大小を比較することで答えを求めることができます。

参考

Array#sort

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?