AtCoder Grand Contest 036と037のA問題を解く
【目次】
【本題】
AtCoder Grand Contest 036 A - Triangle
問題文 整数 S が与えられます。 以下の条件をすべて満たす 6 つの整数 X 1 , Y 1 , X 2 , Y 2 , X 3 , Y 3 を 1 組求めてください。
0 ≤ X 1 , Y 1 , X 2 , Y 2 , X 3 , Y 3 ≤ 10 9 二次元平面上の 3 つの点 ( X 1 , Y 1 ) , ( X 2 , Y 2 ) , ( X 3 , Y 3 ) を頂点とする三角形の面積が S / 2 である。 なお、この問題の制約の範囲で、条件を満たすような 6 つの整数が必ず存在することが証明できます。
制約 1 ≤ S ≤ 10 18 入力される値はすべて整数である。
x1とy1は0
で固定にすると面積を求めやすくなります。
三角形の面積をシンプルに求めるには、高さと底辺が必要ですが、それぞれの座業は定まっていないとそれらの数値の取得が困難になります。
その為、x3とy2以外の座標は全て0で固定する事にしました。
そうすればs / 2 = x3 * y2 / 2
という式が成り立ちます。
これを基に組んだコードがこちらです。
s = gets.to_i puts [0, 0, 0, s, 1, 0].join(' ')
非常にシンプルですが、これだと全てのテストケースが通りません・・・
0≤X1,Y1,X2,Y2,X3,Y3≤10の9乗
と1≤S≤10の18乗
の制約を忘れていました・・・
このコードだと、sが10の9乗より大きい場合に制約に引っ掛かってしまいます。
なので、0で固定するのはx1とy1だけにしました。
s = gets.to_i x1=Math.sqrt(s).ceil puts"0 0 #{x1} 1 #{x1**2-S} #{x1}" p x1 p x1**2-S
AtCoder Grand Contest 037 A - Dividing a String
問題文 整数 S が与えられます。 以下の条件をすべて満たす 6 つの整数 X 1 , Y 1 , X 2 , Y 2 , X 3 , Y 3 を 1 組求めてください。
0 ≤ X 1 , Y 1 , X 2 , Y 2 , X 3 , Y 3 ≤ 10 9 二次元平面上の 3 つの点 ( X 1 , Y 1 ) , ( X 2 , Y 2 ) , ( X 3 , Y 3 ) を頂点とする三角形の面積が S / 2 である。 なお、この問題の制約の範囲で、条件を満たすような 6 つの整数が必ず存在することが証明できます。
制約 1 ≤ S ≤ 10 18 入力される値はすべて整数である。
一文字づつ前後の文字を比較する方法を試しました。
不一致の場合は分割対象としてカウントします。
一致した場合はカウントせず、その文字を次の文字と結合させて比較を行います。
chars
メソッドを使えば、一文字づつブロックを繰り返せます。
s = gets.chomp before_char= '' current_char = '' count = 0 s.chars do |char| current_char += char if before_char != current_char count += 1 before_char = current_char current_char = '' end end puts count