8 カップの水の配列が与えられます。各カップには異なる量の水が入っています。すべてのカップに同じ量の水を入れる必要があり、この関数のみを使用できます。
public void equals(double[] arr, int i, int j) {
arr[i] = arr[j] = (arr[i] + arr[j]) / 2;
}
おそらく再帰的に?何か案は?
ここでマージソート風のロジックを使用できるようです...
カップ1、2、3、4、5、6、7、8をお持ちの場合...
まず、equals(1,2)、equals(3,4)、equals(5,6)、equals(7,8)を実行します。この時点で、カップ1と2は同じ量になり、カップ3と4は同じ量になります。
次に、equals(1,3)、equals(2,4)、equals(5,7)、equals(6,8)を実行します。これで、カップ1、2、3、4の量は同じになり、カップ5、6、7、8の量は同じになります。
Last do equals(1,5)、equals(2,6)、equals(3,7)、equals(4,8)。1,2,3,4はすべて同じ量であるため、equals(1,4)、equals(1,5)などを実行することもできます。このステップの後、すべてのカップは同じ量になります!
これをJavaでコーディングするのに助けが必要な場合は、質問してください。
int qty=8;
for (int mask=1; mask<qty; mask+=mask)
for (int k=0; k<qty/2; k++)
equals(arr, k+(-mask&k), k+(-mask&k)+mask);