torus711 のアレ

主に競技プログラミングの問題について書きます

TopCoder SRM 591, Division 2, Level 1 : TheArithmeticProgression

概要

トリプル ( x, y, z ) が y - x = z - y を満たすとき、( x, y, z ) が等差であるとする。

三つの整数 a, b, c が与えられる。
( a, b, c ) を等差にするために、次の操作が可能である。

  • a, b, c から変数を一つ選び、非負の実数 r を加算または減算する

r の最小値を求めよ。

解法

y - x = z - y の両辺に異符号の y が出てくるため、y に対して操作をすることで、両辺の差を r の二倍動かすことができます。
従って、( b - a ) と ( c - b ) の差の絶対値を 2 で割った値が答えです。

コード

class TheArithmeticProgression
{
public:
	double minimumChange( int a, int b, int c )
	{
		return abs( ( b - a ) - ( c - b ) ) / 2.;
	}
};