LoginSignup
0
0

More than 1 year has passed since last update.

[Ruby] AtCoder過去問 C - Prison

Posted at

はじめに

AtCoder過去問C問題をRubyで解いてみました。
よろしくお願いします。

問題はこちらから確認してください↓

C - Prison

まずは入力受け取ります。

n, m = gets.split.map(&:to_i)
ary = readlines(chomp: true).map{|line| line.split.map(&:to_i)}

2行目は複数行に複数要素が存在するときに二重配列として受け取ります。
入力例1でいえば[[1, 3], [2, 4]]という感じで受け取ります。

この問題の答えの法則はRの中の最小値とLの中の最大値の差に+1した数字が答えになります。

現在の配列では扱いにくいのでL(左側)だけをまとめた配列とR(右側)だけをまとめた配列を作ります。

n, m = gets.split.map(&:to_i)
ary = readlines(chomp: true).map{|line| line.split.map(&:to_i)}
l_ary = []
r_ary = []

ary.each do |a|
  l_ary << a[0]
  r_ary << a[1]
end

これでLだけ、Rだけの配列がそれぞれできました。
入力例1でいえば
l_ary => [1, 2]
r_ary => [3, 4]
となります。

これを使って先ほど述べた「Rの中の最小値とLの中の最大値の差に+1」を出力させます。
もしその答えが0よりも小さくなったら通過できるidカードの数が-1とか-2などの負の数はあり得ないので0以下は全て0と出力させるようにします。

n, m = gets.split.map(&:to_i)
ary = readlines(chomp: true).map{|line| line.split.map(&:to_i)}
l_ary = []
r_ary = []

ary.each do |a|
  l_ary << a[0]
  r_ary << a[1]
end

if (r_ary.min-l_ary.max)+1 < 0
  puts 0
else 
  puts (r_ary.min-l_ary.max)+1
end
0
0
1

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