2

8 カップの水の配列が与えられます。各カップには異なる量の水が入っています。すべてのカップに同じ量の水を入れる必要があり、この関数のみを使用できます。

public void equals(double[] arr, int i, int j) {
    arr[i] = arr[j] = (arr[i] + arr[j]) / 2;
}

おそらく再帰的に?何か案は?

4

2 に答える 2

12

ここでマージソート風のロジックを使用できるようです...

カップ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でコーディングするのに助けが必要な場合は、質問してください。

于 2012-11-24T22:11:23.617 に答える
2
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);
于 2012-11-24T23:22:53.553 に答える