1 から始まる数直線上の位置に収まる 1 から N までの番号付き要素のリストがあります。これらの要素には次の制約もあります。
- 要素 1 は位置 1 にあり、要素 N は位置 >= 要素 N-1 の位置にある必要があります。(つまり、要素 2 は位置 1、要素 3 は位置 7、要素 4 は位置 8 (ただし、位置 5 ではない) にある可能性があります)。
- 一部の要素は、線上で互いに一定の距離内にある必要があります。
- 一部の要素は、ライン上で他の要素から一定以上離れている必要があります。
私の目的は、要素 1 と要素 N の間の最大スパンを表す整数を返すことです。整列が不可能な場合は -1 を返し、要素が任意の距離離れている場合は -2 を返します。
私は与えられます:
- 要素数
- withinArray[][] ここで、 withinArray[x][y] = 距離要素 x と y がライン上にある必要があります。ゼロ値は、制約がないことを表します。
- atLeastArray[][] ここで、atLeastArray[x][y] = 距離要素 x と y は線上で離れている必要があります。ゼロ値は、制約がないことを表します。
入力例は次のようになります: 4 つの要素、withinArray[1][3] = 10、withinArray[2][4] = 20、および atLeastArray[2][3] = 3 (他のすべての配列値はゼロ)。
この入力の戻り値は 27 になります (要素 1 は位置 1、要素 2 は位置 8、要素 3 は位置 11、要素 4 は位置 28)。
これまでのところ、私はこれを思いつきました:
for (int i = 1; i < n; i++) {
for (int j = 1; j < atLeastArray.length; j++)
if (j == i)
positions[i] = positions[j] - atLeastArray[i][j];
for (int j = 1l j < withinArray.length; j++)
if (j == i)
positions[j] = positions[i] + withinArray[i][j];
}
return positions[n] - positions[1];
これにより、私が示した例に対する正しい答えが得られますが、すべての場合に機能するという確信はありません。また、不可能な場合や要素が離れている可能性がある場合のケースを定義する方法もわかりません。