Codeforces Round #152 (Div. 2)

http://www.codeforces.com/contest/248

またもA,B問題だけ解いた。

A. Cupboards

問題文を読み解くのに時間がかかった・・・。

左右のドアの開閉状況(Open = 1、Close = 0)が与えられる。

左右それぞれのドアをすべてOpen/すべてCloseで揃えるために必要な開け閉めの数を求める。

n = gets.chomp.to_i
right = 0
left = 0

n.times do 
  l, r = gets.chomp.split(" ").map{|n| n.to_i}
  left += 1 if l == 0
  right += 1 if r == 0
end

puts [(n - left), left].min + [(n - right), right].min

B. Chilly Willy

[2, 3, 5, 7]のすべてで割り切ることができる、n桁で最小の整数を求める。

2 * 3 * 5 * 7 = 210なので、n <= 3のときは考えるまでもない。

それ以降はどうなのか?

試しに210の倍数を桁上りする度に出力してみると、周期性があることがわかる。

1050
10080
100170
1000020
10000200
100000110
1000000050
10000000080

あとはこれを利用するだけ。

def solve(n)
  return -1 if n <= 2
  return 210 if n == 3
  
  bases = ["050", "080", "170", "020", "200", "110"]
  
  return "1" + "0" * (n - 4) + bases[(n - 4) % 6 ]

end

n = gets.chomp.to_i
puts solve(n)