AtCoder RC093 C: Traveling Plan
問題
https://arc093.contest.atcoder.jp/tasks/arc093_a
解法
観光スポットに行かないケースを毎回計算していると、O(n2)の計算量になってしまいます。
そこで以下のように考えます。
観光地が5カ所の場合、全ての観光地に行くケースの総距離は、
$$総距離 = |A_2 - A_1| + |A_3 - A_2| + |A_4 - A_3| + |A_5 - A_4|$$
となります。そして仮にA3に行かないとすると
$$A_3に行かない場合 = |A_2 - A_1| + |A_4 - A_2| + |A_5 - A_4|$$
となります。これは以下のように総距離からの計算することが出来ます。
$$A_3に行かない場合 = 総距離 - |A_3 - A_2| - |A_4 - A_3| + |A_4 - A_2|$$
よって、事前に総距離を計算しておけば、各ケースは定数時間で算出することが可能です。
なお、以下の実装では配列の先頭と末尾に座標0を設定することで、実装をシンプルにしています。
実装
gets x = Array.new x[0] = 0 gets.chomp.split(' ').each{|n| x.push(n.to_i)} x.push(0) total_dist = 0 for i in 0..(x.size-2) total_dist += (x[i+1] - x[i]).abs end for i in 1..(x.size-2) p total_dist - (x[i+1] - x[i]).abs - (x[i] - x[i-1]).abs + (x[i+1] - x[i-1]).abs end