三角不等式
三角形についての不等式
a, b, cを正数として、a, b, cを三辺とする三角形が存在する必要十分条件は、次の不等式が成立することである。
この不等式を少し変形してみよう。
1変数についての条件に整理する
上の不等式を、
2つ目の式で右辺の
3つ目の式で右辺の
である。
と書ける。2つ目の式とまとめると、
と書ける。
a, b, cは正であること
絶対値は非負であるから、
よって、
すなわち、三角不等式を満たすためには、
一番上で、
a, b, cの大小関係を仮定する場合
今、
と、
の辺々を加えることで、
が出る。これは、
つまり、
一方、前半部分について考えると、
だから、
よって、
したがって、この大小関係の仮定のもとで三角不等式は
と同値である。
bを固定する場合
同じく、
この関係をa-cグラフに表すと次のようになる。
図の赤く塗った部分が三角不等式の成立する範囲である (直線
この図は少し面白く、この領域の各点が、一つの三角形の「形」に対応していることになる。
たとえば、右下の頂点
例題 (Codility)
Codilityというコーディングテストのプラットフォームがあり、そこの練習問題に Triangleというものがある。
次のような問題である。
N個の整数値からなる配列Aが与えられるので、Aの中に三角不等式を満たす組が存在するかしないかを判定するような関数をかけ。
今までの考察からいえば、次のような解答例が考えられる。
#include <algorithm>
int solution(vector<int> &A) {
// 配列Aをソート
std::sort(A.begin(), A.end());
// 配列Aのサイズ
int size = A.size();
// 正になるまでインデックスを進める
int i = 0;
while (i < size && A[i] <= 0) {
++i;
}
// 3つ組を順に見ていって三角不等式が成立するかを見る
for (; i < size - 2; ++i) {
if (A[i + 2] - A[i] < A[i + 1]) {
return 1;
}
}
// ループの最後に到達したら成立しなかったことになる
return 0;
}
キーとなる考察は、「できるだけ近い値同士を見ていって、三角不等式が成立するかを確認する」という点である。